Java JPA和Hibernate实体的列表属性中存在重复项
我试图解决的问题是在hibernate中避免列表属性中出现重复项。 考虑下面的域。Java JPA和Hibernate实体的列表属性中存在重复项,java,hibernate,jpa,Java,Hibernate,Jpa,我试图解决的问题是在hibernate中避免列表属性中出现重复项。 考虑下面的域。 public class Account { @OneToMany(fetch = FetchType.LAZY) @JoinTable(name = "FI_COMPANY_ACCOUNT", joinColumns = @JoinColumn(name = "ACCOUNT_ID", referencedColumnName = "ID"), inverseJoinCo
public class Account
{
@OneToMany(fetch = FetchType.LAZY)
@JoinTable(name = "FI_COMPANY_ACCOUNT", joinColumns = @JoinColumn(name = "ACCOUNT_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "COMPANY_ID", referencedColumnName = "ID"))
private List<Company> companies;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AccountDesc> accountDescList;
}
public class Company {}
public class AccountDesc
{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_ID", referencedColumnName = "ID")
private Account account;
}
公共类帐户
{
@OneToMany(fetch=FetchType.LAZY)
@JoinTable(name=“FI\u COMPANY\u ACCOUNT”,joinColumns=@JoinColumn(name=“ACCOUNT\u ID”,referencedColumnName=“ID”),inverseJoinColumns=@JoinColumn(name=“COMPANY\u ID”,referencedColumnName=“ID”))
私人上市公司;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“account”,cascade=CascadeType.ALL,orphan=true)
私人名单
但我面临的问题是,帐户中的属性“公司”也有重复的实体。如果AccountDescrList有多个条目,就会发生这种情况
为了解决属性公司中的重复问题,我认为唯一的解决方法是使用Set。请您澄清以下问题
除了使用Set(针对属性公司)之外,还有其他方法可以解决此问题
即使我使用了,我也可以指示hibernate使用OrderedSetType(使用LinkedHashSet)。这样我就可以保留从数据库返回的项目的顺序。不幸的是,我没有在OrderBy中使用的属性。我需要数据库返回的任何默认顺序
提前感谢。我认为使用Set更好,因为Set不允许元素重复,而且您可以覆盖公司的equals方法,并将其放在两个元素相等时将要验证的字段上。
另一种方法是在setcompanys(List companys)方法中,您可以在此之前设置一些逻辑。companys=companys.stream().distinct().collect(Collectors.toList());或者
this.companys=newarraylist(newhashset(companys))
但我面临的问题是,账户中的公司也有重复实体
除非您将重复的公司
实体分配给同一帐户,否则不应发生这种情况
在Criteria API查询中使用将删除根重复项。但是,在您的情况下,不值得在两个@OneToMany
关系上使用连接获取,因为这将导致笛卡尔积
您一次最多只能获取一个集合,并且可能使用@Subselect
获取第二个集合。感谢Vlad的回复。我检查并确认重复的公司实体没有分配给同一个帐户。我确实理解根实体是重复的,并且其解决方案很好。但是重复的属性(Company)中的项确实让我感到困扰:-)。因此,即使我在一个查询中使用两个fetch,在内部属性中获取重复的项是否正确?如果是这样,我将使用Set。
Root<Account> root = criteriaQuery.from(Account.class);
root.fetch("companies", JoinType.LEFT);
root.fetch("accountDescList");