Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA和Hibernate实体的列表属性中存在重复项_Java_Hibernate_Jpa - Fatal编程技术网

Java JPA和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

我试图解决的问题是在hibernate中避免列表属性中出现重复项。 考虑下面的域。

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");