与父级相同类型的@ManyToOne,其中DB中不存在子级

时间:2014-04-02 19:13:05

标签: java mysql hibernate jpa spring-roo

我使用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不存在?如果它不存在,我最好强制它为空。

1 个答案:

答案 0 :(得分:1)

如果您使用Hibernate,可以尝试

@NotFound(action = NotFoundAction.IGNORE)

否则你必须清理你的数据库(0不是null)。如果没有父级,则ORIG_TRANS_ID应为null