关于如此常见的Target Unreachable Exception,我有2个问题。 处理它的最佳做法是什么,例如: 国家有城市,城市有街道。 - 你把Country的构造函数new City()和City的构造函数new Street() (这样你就可以把它们放到一个集中的地方,但总是制作你可能不需要的物品) 或者您在代码中的不同位置初始化对象,您需要它们? (遍布你的代码) - 如果用户没有为Street输入任何内容,为了防止在DB中插入空白行 你把街道放回去了。哪里是把它放回null的最佳位置? (假设您有Cascade.ALL或扩展上下文,否则如果您知道它是空的,则不会保存它)
PS:为什么JSF不是只是实例化它需要什么,而Hibernate不会持久化所有持久字段为空的实体? 为了表现还是为什么?再一次,在db中有空行是不好的,只有PK和FK?答案 0 :(得分:2)
我认为这取决于您应用中实体之间的关系。在某些情况下,我会在构造函数中加载另一个对象的相关实例,但仅限于没有另一个实体的情况。
另一种方法是在getter中懒惰地创建对象:
public class Country {
private City city;
public City getCity() {
if (this.city == null) {
this.city = new City();
}
return this.city;
}
}
就PS问题而言,JSF没有为你实例化对象 - 我不确定这是否可取......但如果你使用懒惰的getter方法,你就会有效地得到同样的东西。如果实体已经实例化,Hibernate会持久保存实体,因为它会持久保存对象模型的当前状态,如果它没有持久存在,那么它将无法按预期工作。
我通常不担心一些空行,因为我选择使用Hibernate知道ORM的性能成本很低。对我来说,享受持久性的抽象仍然是值得的。