【发布时间】:2014-04-02 19:13:04
【问题描述】:
我使用 Spring Roo 对 MySQL 数据库进行了逆向工程,这是一个我只有读取权限的数据库。
其中一个名为 Transaction 的实体有一个名为 originalTransaction 的字段,在 DB 中设置为可以为 null,但默认值为 0。
@RooJavaBean
@RooToString
@SuppressWarnings("serial")
@RooDbManaged(automaticallyDelete = true)
@RooJpaActiveRecord(versionField = "", table = "TRANSACTIONS")
public class Transaction implements Serializable {
....
@Fetch(value = FetchMode.SELECT)
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "ORIG_TRANS_ID")
private Transaction originalTransaction;
....
}
我添加了 FetchMode.Select 和 FetchType.Lazy 作为其他问题的解决方法。
现在,当我插入一个事务并将 originalTransaction 保留为空时,数据库会将其更改为 0。
当我执行 entity().find(12345678) 时,出现以下错误:
Unable to find Transaction with id 0
javax.persistence.EntityNotFoundException: Unable to find Transaction with id 0
at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:157)
at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:261)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:175)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
很明显(最初并不那么明显),它试图找到 originalTransaction 并且由于 DB 将 null 更改为 0,它试图找到不存在的 id=0 的 Transaction - 这会导致实体。即使事务在数据库中,find(12345678) 也会返回 null。
如果数据库中的 originalTransaction 的 id 不存在,是否有任何解决方法可以阻止 Hibernate / JPA 放弃搜索并返回 null?如果它不存在,我最好强制它为空。
【问题讨论】:
-
@SuppressWarnings总是让我内心抽搐。 :) 不过,对你写得很好的问题 +1。 -
@SuppressWarnings 实际上应该消失,该类缺少“public static final long serialVersionUID = _____L;”感谢您指出:-)
标签: java mysql hibernate jpa spring-roo