Pergunta

Atualização: Exemplo para esclarecer Vou dar um exemplo do que está acontecendo apenas para esclarecer a situação no meu aplicativo Spring + Hibernate. Imagine que eu tenho essas duas entidades (suponha que getters e setters também existam)

@Entity
public class Class1(){
  private Integer id;

  @OneToOne
  private Class2 object2;
}

@Entity
public class Class2(){
  private Integer id;

  @OneToOne
  private Class1 object2;
}

Então, no meu banco de dados, tenho duas tabelas para mapear todas as instâncias de cada objeto. Suponha que eu armazenei no banco de dados estes objetos:

  • Objecta (classe classe1): id = 1, object2 = objectB
  • ObjectB (classe classe2): id = 2, object2 = objeto
  • Objectc (classe classe2): id = 3, object2 = null, o que significa que um ANB B está vinculado. Suponha agora que eu queira vincular objetos ao objeto. Isso significa que também tenho que excluir o link no objeto.

Por fazer isso, eu faço o seguinte:

//I get the objectA from database
Class1 storedObjectA = myservice.find(objectAId);
//Now in storedObject1 I have the same as what it is stored as objectA

//I change only the object2 attribute of it
storedObject1.setObject2(objectC);

//I search again in the database to see objectA
Class1 reStoredObjectA = myservice.find(objectAId);

RestoredObjecta agora é:

  • restauredObjecta (class = classe1) id = 1, object2 = objectc

Embora no banco de dados exista:

  • restauredObjecta (class = classe1) id = 1, object2 = objectB

O Método Find não pesquisou no banco de dados e recebi a pesquisa anterior, embora tenha minha consulta e caches de segundo nível desativados. O método Lettle vai apenas para o DAO, onde ele é executado no entityManager.find (classe1.class, id) Como posso fazer minha segunda busca de pesquisas no banco de dados?

Obrigado


(Explicação completa)

Olá,

Eu tenho um aplicativo que usa a Spring 3 e o Hibernate. Eu tenho uma entidade chamada Class1 que é armazenada em um banco de dados. Essa entidade tem um link de OnetoOne para outra entidade chamada Class2. A Classe2 possui outro link OnetoOne para a Classe1, e os dois links têm propriedades exclusivas definidas como true.

Eu tenho o seguinte código no meu controlador:

//I have an object called dataFromUser which is instance of Class1 and
// it is obtained via @ModelAttribute annotation from a form

Integer id = dataFromUser.getId();

//I get correctly the stored object from the database
Class1 storedData = myService.find(id); //this will call em.find of hibernate

//I set to the stored data the attribute I want to change
storedData.setObject2();

//I save again the object
myService.save(storedData);

O método salvo no MyService usará o Entity Manager para persistir os dados, mas antes disso ele verificará a associação anterior entre o objeto Class1 e o objeto Class2 para excluí -los caso um novo objeto Class2 tenha definido na instância da classe1. Por esse motivo, tenho que ligar para encontrar o método novamente para ver o que está no meu banco de dados

No serviço:

@Transactional
public void save(Class1 object1){
   Class1 objectFromDB =  myDAO.find(object1.getId());
   // ....  update the old object and save
}

O problema é que o objectFromdb no serviço não é o mesmo que quando eu fiz o myService.find (id) no controlador. O problema é que ele não está procurando no banco de dados, mas está pesquisando na memória. Eu sei porque não há instrução SQL registrada quando o segundo método find () é chamado. Como eu fiz o setObject2 () no objeto StoredData, recebo exatamente esse objeto quando chamo o método Find Find pela segunda vez, e o banco de dados não o contém porque ainda não foi persistido.

Eu tentei desativar o cache em minha configuração apenas para tentar, mas ainda está acontecendo. Eu tenho um ehcache com esta configuração:

Em persistence.xml eu tenho essas propriedades (eu configurei para false os dois caches):

    <properties>
     <!-- Hibernate 3.5.0 - try org.hibernate.cache.* package -->
  <property name="hibernate.cache.provider_class"
               value="net.sf.ehcache.hibernate.SingletonEhCacheProvider" />
   <property name="hibernate.cache.use_query_cache" value="false" />
  <property name="hibernate.cache.use_second_level_cache" value="false" />
  <property name="hibernate.generate_statistics" value="true" />
  <property name="hibernate.cache.use_structured_entries" value="false" />
  <property name="hibernate.format_sql" value="true" />
  <!-- http://www.jroller.com/eyallupu/entry/hibernate_s_hbm2ddl_tool -->
  <!-- create, create-drop, update, validate -->
  <property name="hibernate.hbm2ddl.auto" value="update" />
    </properties>  

No meu ehcache.xml, eu configurei como 0 maxElementsInMemory e OverflowTodisk como false para desativá -lo também.

Existe alguma maneira de evitar essa situação?

Obrigado.

Foi útil?

Solução 2

Ok, eu descobri. O problema é que o Hibernate procura os objetos em sua sessão antes de pesquisar no banco de dados. Então, eu tive que desapegar o objeto para a sessão antes de modificá -lo. Fazer isso em Hibernate:

    //being em my EntityManager instance
    Session session = (Session) em.getDelegate();
    session.evict(plan); 
    //Now the find object will not get the object wich is in session 
    //but the one in database

Outras dicas

para o SharePoint 2010, se o seu aplicativo da web tiver um domínio diferente do site do SharePoint, você receberá esse erro.

Se for esse o caso, não acho que seja possível sem soluções muito hacky usando iframes ou jsonp.

Desculpe por ser o portador de más notícias, mas tenho certeza de que você precisa de acesso ao servidor. O CORS deve exigir acesso ao servidor para proteger as pessoas de ataques de domínio cruzados. Aqui está um link sobre como fazer isso no IIS (que hospeda SharePoint)

Se você tiver acesso ao eSharePoint Enviornment, considere hospedar isto dentro do SharePoint, pois isso tornará sua vida muito mais fácil. Você também pode criar um diretório no servidor IIS e implantar seus arquivos de aplicativos da Web lá. Dessa forma, você pode ter o mesmo domínio.

Se você tiver que implantar em seu próprio servidor, você terá que desenvolver sua própria API que chama o SharePoint. Que a API seria melhor construída no .NET para que você possa usar o .NET SharePoint CSOM.

Com o SharePoint 2013 eu aconselho você a dar uma olhada nos aplicativos do SharePoint. Eles permitem que você crie sua inscrição em um sistema externo e as pessoas possam instalá-lo no SharePoint

Editar: isso definitivamente é possível com o modelo de aplicativo do SharePoint 2013 e a biblioteca de domínio cruzado que a Microsoft forneceu. Dê uma olhada neste vídeo para uma demonstração completa do que será necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top