2013-03-28 12 views
5

私はHibernate 4.1.4.Final実装でJPAを使用しています。私の問題は、私が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というクエリが実行される場所やエラーが発生しているとは思われません。

そして、私は本当にここから外れています。ご意見をお聞かせください。

EDIT

多分これも役立ちます:

を私は他のエンティティからの回答のリストを取得しています。このように削除呼び出し

@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

+0

はい。他のすべては動作しており、他の操作ではすべて同じです。 – user2219247

+0

@rhinds質問を更新しました。多分あなたは今問題を見ることができます。 – user2219247

答えて

4

私は、トピックから外れかもしれないが、これらは問題

第一の理由のための問題ことができ - このエントリに定義されているカスケードタイプはありません。

第二の理由(提案の詳細)

回答のLinkedListの直接良いプラクティスとして推奨されないリストから単一のオブジェクトを削除する、質問オブジェクトにマッピングされるように。リンクされたリストから要素を削除してから、Answerテーブルで自動的に削除操作を実行する質問オブジェクトを更新/マージします。

希望します。

+0

カスケード型は定義されていません。なぜなら、このオブジェクトをカスケードする必要がないからです:)それは問題ありません。第二の理由は、解決策への道を与えました。はい、entityManager.removeを呼び出す必要はありません。これをリストから削除すると、作業が完了します。ありがとう。休止状態が永続コンテキストをクリアしなかった理由を完全に理解することはできません。オブジェクトが遅延ロードされている可能性があります... – user2219247

+0

Hibernateが少なくともem.remove(ref)を呼び出してリスト項目を削除してもらうと、同じ問題が発生します。ああ、レッスンは学んだ。 –