Управление постоянным контекстом перед сбросом - PullRequest
1 голос
/ 15 сентября 2010

рассматривают hibernate-link и JTA как поставщика постоянных прав. Как я могу заставить их ничего не сбрасывать, а справляться самому?

@Stateless 
public class SomeBean{
  @PersistenceContext
  EntityManager em;
  public void method(){
    em.persist(entity); // will get managed
    em.clear(); // everything gets unmanaged
  }
}

Я бы ожидал, что в базу данных ничего не сбрасывается, но это, как я вижу, в оболочке mysql. Так как же заставить EntityManager ничего не сбрасывать после сохранения? Благодаря
persistence.xml для полноты <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence <a href="http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" rel="nofollow noreferrer">http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd</a>"> <persistence-unit name="pu" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence <jta-data-source>jdbc/fotbalDataSource <properties> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>

1 Ответ

0 голосов
/ 16 сентября 2010

Как я могу заставить их ничего не сбрасывать, и обрабатывать это самостоятельно?

Как ответили в на ваш предыдущий вопрос , используйте em.setFlushMode(FlushType.COMMIT), есливы хотите избежать автоматической flush до фиксации транзакции JTA (в конце метода EJB).Просто имейте в виду, что во время коммита будет flush.

Я ожидаю, что в базу данных ничего не сбрасывается, но, как я вижу, в оболочке mysql.

Я не думаю, что фрагмент кода, который вы показываете, иллюстрирует вышеупомянутый вопрос, здесь другой вопрос.В любом случае ... прежде чем идти дальше, вот что говорится в спецификации JPA о clear():

/**
* Clear the persistence context, causing all managed
* entities to become detached. Changes made to entities that
* have not been flushed to the database will not be
* persisted.
*/
public void clear();

Так что clear() заставляет все управляемые объекты становиться обособленными , а не неуправляемый .

Другими словами, хотя спецификация немного мутная в отношении вашего варианта использования, я не думаю, что вызов clear() должен сделать сущность, переданную в persist() в вашем фрагменте кода, новый объект снова.

Завтра я протестирую это более подробно (даже если я думаю, что этот вариант использования не имеет особого смысла) и обновлю свой ответ.

...