2013-03-28 80 views
5

我使用JPA而不是Hibernate 4.1.4.Final實現。我的問題是,我無法獲得EntityManager#remove()的工作。所有其他:更新,插入,選擇操作工作正常,除此之外。使用JPA與Hibernate實現:entityManager.remove - 不能正常工作

persistence.xml文件:

<persistence-unit name="myEntityManager"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>core.entity.Answer</class> 
    <class>core.entity.BaseEntity</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <validation-mode>NONE</validation-mode> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
    </properties> 
</persistence-unit> 

Answer實體:(BaseEntity類只是持有主鍵 - ID)

@Entity 
@Table(name = "ANSWER") 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Answer extends BaseEntity { 

    @Column(name = "ANSWER_VALUE") 
    private String answerValue; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "QUESTION_ID", nullable = false) 
    private Question question;     

    //overrided equals, hascode, toString 
    // all getters and setters 
} 

致電時:

public void remove(T entity) { 
    this.entityManager.remove(this.entityManager.merge(entity)); 
} 

也試過:

this.entityManager.remove(entity); 

和:

T ref = entityManager.getReference(entityClass, primaryKey); 
entityManager.remove(ref); 

沒有運氣:(它不會從數據庫中刪除的Answer紀錄。

我使用Spring配置文件來配置實體管理器這樣的:

<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
    <property name="persistenceXmlLocations"> 
     <list> 
      <value>classpath*:META-INF/persistence.xml</value> 
     </list> 
    </property> 
    <property name="defaultDataSource" ref="dataSource"/> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitManager" ref="persistenceUnitManager"/> 
    <property name="persistenceUnitName" value="myEntityManager"/> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/> 

remove被稱爲在標註有@Transactional註釋的方法。所以它不應該是交易問題。

我已啓用Hibernate SQL日誌記錄,所有其他日誌記錄。我沒有看到delete查詢將被執行或任何錯誤。

我真的沒有在這裏的選擇。請指教。

編輯

也許這也將有助於:

我正在從其他實體答案的列表。這些問題的答案是這樣定義的:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "evaluationPart") 
private List<Answer> answers = new LinkedList<>(); 

調用刪除這樣的:

List<Answer> answers = evaluationPart.getAnswers(); 
if (answers != null && answers.size() > 0) { 
    for (Answer answer : answers) { 
     answerFacade.remove(answer); //This calls enetityManager.remove 
    } 
} 
+0

而你的其他創建/更新方法都可以正常工作,並按預期持續嗎?這些方法是否在同一個班級並使用相同的設置? – rhinds 2013-03-28 10:52:48

+0

是的。其他一切正在工作,其他操作的一切都是一樣的。 – user2219247 2013-03-28 10:55:50

+0

@rhinds我更新了這個問題。也許你現在可以看到問題了。 – user2219247 2013-03-28 12:21:39

回答

4

我可能出了問題,但這些都可以對這個問題

第一個原因問題 - 此條目中沒有cascadeType

@ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "QUESTION_ID", nullable = false) 
    private Question question; 

第二個原因(更多的是建議的)

爲答案的鏈表被映射到問題的對象,直接,不建議作爲一個很好的做法列表中刪除一個對象。最好從鏈接列表中刪除元素,然後更新/合併將在應答表上自動執行刪除操作的問題對象。

希望這會有所幫助:)

+0

沒有級聯類型被定義,因爲我不希望這個對象以任何方式級聯:)沒關係。你的第二個原因爲解決方案提供了一條途徑。是的,我不需要調用entityManager.remove,如果我從列表中刪除它,所以工作。謝謝。仍然不能完全理解爲什麼hibernate沒有清除持久化上下文。也許是因爲對象是懶加載的... – user2219247 2013-03-28 13:50:03

+0

只是有同樣的問題,這將是很好,如果Hibernate至少會通過調用em.remove(ref)來嘲笑你刪除列表項。哦,經驗教訓。 – 2013-05-13 17:53:29