Spring 具有良好性能的 Hibernate 单向一对多关联
Spring Hibernate uni-directional One-To-Many associations with good performance
根据这两篇文章:
应避免单向关联。最佳实践(让我们坚持多边上的少数实体)是添加双向关联。
我觉得这在两个方面很奇怪:
在数据库中创建第三个 table 来映射 @onetomany。据我所知,这是相当糟糕的(为了简单性和性能),因为如果你有效地查询,你可以只使用一个外键。此外,如果您有自己的查询,则必须考虑第三个 table,从而导致更多工作和可能的不一致。
在 java 代码中,您在父元素中有一个列表,并且每个子元素都有一个对父元素的引用。虽然这在 java 应用程序中似乎不是一个巨大的性能问题,但它仍然需要努力避免不一致。有一些方法可以解决这个问题,但如果您不注意,它仍然容易出现不一致。
那么我认为最好的方法是什么?
- 在 java 应用程序中,您只会在父 class.
中拥有列表
- 在数据库中,您没有第三个 table,只有一个外键。
有没有办法既能实现这一点,又能保持良好的性能?我引用的文章都是 Hibernate,Spring 有解决这个问题的方法吗?
您不需要为此加入table。你可以像这样映射它:
@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;
}
}
这将完全按照您喜欢的方式工作。在 IMO 中保持关联同步并不是什么大问题。您只需要将父关联保持私有并通过包私有方法管理该字段的设置。
根据这两篇文章:
应避免单向关联。最佳实践(让我们坚持多边上的少数实体)是添加双向关联。
我觉得这在两个方面很奇怪:
在数据库中创建第三个 table 来映射 @onetomany。据我所知,这是相当糟糕的(为了简单性和性能),因为如果你有效地查询,你可以只使用一个外键。此外,如果您有自己的查询,则必须考虑第三个 table,从而导致更多工作和可能的不一致。
在 java 代码中,您在父元素中有一个列表,并且每个子元素都有一个对父元素的引用。虽然这在 java 应用程序中似乎不是一个巨大的性能问题,但它仍然需要努力避免不一致。有一些方法可以解决这个问题,但如果您不注意,它仍然容易出现不一致。
那么我认为最好的方法是什么?
- 在 java 应用程序中,您只会在父 class. 中拥有列表
- 在数据库中,您没有第三个 table,只有一个外键。
有没有办法既能实现这一点,又能保持良好的性能?我引用的文章都是 Hibernate,Spring 有解决这个问题的方法吗?
您不需要为此加入table。你可以像这样映射它:
@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;
}
}
这将完全按照您喜欢的方式工作。在 IMO 中保持关联同步并不是什么大问题。您只需要将父关联保持私有并通过包私有方法管理该字段的设置。