2010-09-15 3 views
1

рассмотрите hibernate-link и JTA как поставщик жизненного цикла. Как я могу заставить их ничего не смывать и не справиться с этим?Управление постоянным контекстом перед промывкой

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

я ожидал бы, что нет ничего продували в базу данных, но есть, как я могу видеть в тузд оболочки. Итак, как я могу заставить 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 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd "> 
    <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> 

ответ

0

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

Как ответил your previous question, используйте 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() в вашем фрагменте кода на новый объект снова.

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

+0

это похоже на ошибку в спящем режиме. После того, как я перешел на Eclipelink, он работает как ожидалось – coubeatczech

+0

@coubeatczech Интересно. Мне действительно интересно, если это ошибка или разница в интерпретации спецификации. Вы создали проблему с Jira? –

+0

@coubeatczech Как-то, я не уверен, что вы «ожидали» - это правильное поведение. Спецификация JPA не определяет какой-либо NEW -> MANAGED -> NEW переход. И поскольку NEW -> MANAGED -> DETACHED требует, чтобы объект был устойчивым, прежде чем отсоединять его, я думаю, что Hibernate на самом деле более корректен. –

Смежные вопросы