5

実装よりJPAを使用していHibernate 4.1.4.Finalます。私の問題は、仕事ができないこと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<>();

次のように remove を呼び出します。

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

1 に答える 1

4

私は話題から外れているかもしれませんが、これらは問題の問題である可能性があります

最初の理由- このエントリに cascadeType が定義されていません

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

2 番目の理由(より多くの提案)

Answer のリンクされたリストは Question オブジェクトにマップされるため、リストから単一のオブジェクトを直接削除することは推奨されません。リンクされたリストから要素を削除してから、回答テーブルで削除操作を自動的に実行する質問オブジェクトを更新/マージすることをお勧めします。

お役に立てれば :)

于 2013-03-28T12:37:28.793 に答える