【发布时间】:2015-04-19 21:27:07
【问题描述】:
我有一个模型父级,它有一个子级列表(列表
class Parent {
@OneToMany(targetEntity = Child.class, cascade = CascadeType.ALL, mappedBy = "parent")
@JsonManagedReference
private List<Child> tags = new ArrayList<>();
@Column(name = "name")
public String name;
}
class Child {
@Column(name = "name")
public String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id", nullable = true)
@JsonBackReference
private Parent parent;
}
我在 EAGER 模式下选择了一个包含孩子的父母列表 (List )。
现在孩子可以有相同的名字,但我不希望同名的孩子在列表中不止一次。 有什么建议如何让同名的孩子在集合中只出现一次?
【问题讨论】:
-
您应该使用 Java
Set存储您的Child列表;此外,您的equals和hasCode(对于该实体)的实现也很重要 -
数据库是否允许重复名称?如果没有,请考虑使用
@Column(name = "name", unique=true) -
@Machina 是的,但是如何从 Hibernate Criteria 返回一个集合?
-
@Shahzeb - 是的,数据库允许重复名称。
-
@Sergiu,我在这里看到了一些不匹配:您可以在数据库中有许多具有相同/重复名称的
chils,您可以将这些(甚至重复)与同一个父级关联。由于没有办法(AFAIK)从 Hibernate 条件查询中返回Set,我建议您使用类似:setProjection(Projections.distinct(Projections.property("name")))...并且仍然在您的模型中使用Set
标签: java hibernate hibernate-criteria hibernate-4.x