假设我有以下实体
@Entity
public class Item{
private Country origin;
@ManyToOne(optional=true)
@JoinColumn(name="origin")
public Country getOrigin() {
return this.origin;
}
}
@Entity
public class Country{
private String code;
private String desc;
@Id
public String getCode() {
return this.code;
}
@Column
public String getDesc() {
return this.desc;
}
}
其中Country
类映射到预设的主表,不应修改。
用户可以在创建新origin
时设置code
的{{1}}。
如何检查提供的Item
是否已经是主表中的条目?
如果我只是code
新的persist()
且不存在Item
而未坚持该孩子,则会报告code
。我是否只需要尝试捕获此异常以将其视为不存在的主数据?还是有更好的选择吗?
在实际案例中,org.hibernate.TransientObjectException
对象中有很多这些子实体,我认为一个接一个地明确查找主数据并不是一个好主意。我认为这也不是一个好的解决方案。
答案 0 :(得分:1)
任何解决方案都需要查看主表以查看Country
是否已存在。这是一个问题,你是否明确地进行了这个调用,或者你要求你的框架(Hibernate)为你做这个。
如果您知道创建Country
的源/输入无法依赖,我会明确地验证表中的Item
数据。如果您有一个可以严格控制的GUI,那么可能永远不会发生此错误,因为您应该只向用户提供存在的有效选项。同样通过明确,如果您知道必须在持久化之前检查,由于数据不可靠,您可以编写单元测试以包含此显式检查。
请记住,Hibernate会将您的查询缓存到Country表中,因此我不希望它会影响您的应用程序的性能。