我使用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保留为null时,数据库会将其更改为0。
当我执行一个实体()。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哪个不存在 - 这会导致entity.find(12345678)返回null,即使该事务在数据库中也是如此。
是否有任何解决方法可以阻止Hibernate / JPA免于搜索并返回null,如果DB中的originalTransaction的id不存在?如果它不存在,我最好强制它为空。
答案 0 :(得分:1)
如果您使用Hibernate,可以尝试
@NotFound(action = NotFoundAction.IGNORE)
否则你必须清理你的数据库(0不是null
)。如果没有父级,则ORIG_TRANS_ID
应为null