gpt4 book ai didi

java - @ManyToOne 与数据库中不存在子项的父项类型相同

转载 作者:行者123 更新时间:2023-11-29 03:01:37 28 4
gpt4 key购买 nike

我使用 Spring Roo 对 MySQL 数据库进行逆向工程,这是一个我只有读取权限的数据库。

其中一个名为 Transaction 的实体有一个名为 originalTransaction 的字段,在数据库中它被设置为可以为 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)

很明显(最初并不那么明显),它试图找到原始事务,并且由于数据库将 null 更改为 0,它试图找到不存在的 id=0 的事务 - 这会导致实体。 find(12345678) 返回 null,即使事务在数据库中也是如此。

如果 originalTransaction 的 id 在数据库中不存在,是否有任何解决方法可以阻止 Hibernate/JPA 阻止搜索并返回 null?如果它不存在,我最好将其强制为 null。

最佳答案

如果你使用Hibernate你可以试试

@NotFound(action = NotFoundAction.IGNORE)

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

关于java - @ManyToOne 与数据库中不存在子项的父项类型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22820869/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com