将JPA与Hibernate实现一起使用:entityManager.remove - 不工作

use*_*247 5 java persistence hibernate jpa

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

我的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
}
Run Code Online (Sandbox Code Playgroud)

致电时:

public void remove(T entity) {
    this.entityManager.remove(this.entityManager.merge(entity));
}
Run Code Online (Sandbox Code Playgroud)

还尝试过:

this.entityManager.remove(entity);
Run Code Online (Sandbox Code Playgroud)

和:

T ref = entityManager.getReference(entityClass, primaryKey);
entityManager.remove(ref);
Run Code Online (Sandbox Code Playgroud)

没有运气:(它不是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"/>
Run Code Online (Sandbox Code Playgroud)

remove在使用@Transactional注释注释的方法中调用.所以它不应该是交易问题.

我启用了Hibernate SQL日志记录,所有其他日志记录.我没有看到任何delete查询将被执行或任何错误.

我真的没有选择.请指教.

编辑

也许这也会有所帮助:

我从另一个实体获得答案列表.答案定义如下:

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

像这样调用删除:

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

Cod*_*ace 4

我可能脱离了主题,但这些可能是问题的根源

第一个原因- 此条目中未定义cascadeType

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

第二个原因(更多的是建议)

由于 Answer 的链表映射到 Question 对象,因此不建议直接从列表中删除单个对象。最好从链表中删除元素,然后更新/合并问题对象,这将在答案表上自动执行删除操作。

希望这可以帮助 :)