根据这两篇文章:
vlahidmihalcea.com
thorben-jansen.com
应避免单向关联。最佳实践(让我们坚持多方面的少数实体(是添加双向关联。
这在两个方面对我来说很奇怪:
-
在DB中创建第三个表来映射@onetomany。据我所知,这是相当糟糕的(为了简单和性能(,因为如果查询有效,您只能使用一个外键。此外,如果您自己进行查询,则必须考虑第三个表,这将导致更多的工作和可能的不一致。
-
在java代码中,父级中有一个List,每个子级都有一个对父元素的引用。虽然这在java应用程序中似乎不是一个巨大的性能问题,但它仍然需要努力避免不一致。有一些方法可以解决这个问题,但如果你没有意识到,它仍然容易出现不一致。
那么在我看来,什么是最好的方法呢?
- 在java应用程序中,父类中只有List
- 在数据库中,没有第三个表,只有一个外键
有没有一种方法可以在保持良好性能的同时实现这一点?我引用的这两篇文章都只是Hibernate,Spring有解决这个问题的方法吗?
您不需要连接表。你可以这样映射:
@Entity
public class Parent {
@OneToMany(mappedBy = "parent")
Set<Child> children;
public Set<Child> getChildren() {
return Collections.unmodifiableSet(children);
}
public void addChild(Child c) {
children.add(c);
c.setParent(this);
}
}
@Entity
public class Child {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_column_name")
private Parent parent;
void setParent(Parent p) {
this.parent = p;
}
}
这将完全按照你喜欢的方式工作。保持关联同步不是什么大不了的事。你只需要保持父关联私有,并通过包私有方法管理字段的设置。