我在Hibernate 4.1.4.Final
实施时使用JPA。我的问题是我无法让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 :(得分:4)
我可能不在话题中,但这些可能是问题的问题
第一个原因 - 此条目中未定义cascadeType
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "QUESTION_ID", nullable = false)
private Question question;
第二个原因(更多建议)
由于Answer的链表被映射到Question对象,因此不建议直接从列表中删除单个对象作为一种良好做法。最好从链表中删除元素,然后更新/合并将在Answer表上自动执行删除操作的问题对象。
希望这会有所帮助:)