Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 构造hibernate实体时如何处理双向关系?_Java_Hibernate_Constructor_Side Effects_Bidirectional Relation - Fatal编程技术网

Java 构造hibernate实体时如何处理双向关系?

Java 构造hibernate实体时如何处理双向关系?,java,hibernate,constructor,side-effects,bidirectional-relation,Java,Hibernate,Constructor,Side Effects,Bidirectional Relation,我想用JPA/Hibernate对两个实体(一个组和一个帐户)之间的关系进行建模。一个帐户可以有多个组,但不能有多个组,所以帐户和组之间存在一对一关系。 我的工作同事建议对实体账户和组进行建模 public class Account { private List<Group> groups = new ArrayList<Group>(); public Account() {} public void setGroups(List<G

我想用JPA/Hibernate对两个实体(一个组和一个帐户)之间的关系进行建模。一个帐户可以有多个组,但不能有多个组,所以帐户和组之间存在一对一关系。 我的工作同事建议对实体
账户
进行建模

public class Account {
    private List<Group> groups = new ArrayList<Group>();

    public Account() {}

    public void setGroups(List<Group> usergroups) {
        this.groups = groups;
    }

    @OneToMany(mappedBy = "account")
    public List<Group> getGroups() {
        return groups;
    }
}

并手动处理双向关系。但也许我错了。在构建hibernate实体时,有没有一种处理双向关系的通用方法?

根据我的经验,您的做法与通常的做法完全相同。我的问题更多的是关于结构(我希望比上面提供的示例要多得多),关于为什么要直接从组中操纵帐户

我还质疑这是一个单一的情况还是多个情况(通常多个帐户可以属于一个组,多个组可以属于一个帐户,但这完全符合您特定会计方案的语义…)无论如何:您做得对,尽管我质疑(在这种情况下)为什么要直接操纵帐户(除非它是惰性加载的),这完全没有问题

[您可能需要添加一些级联规则,以便根据您的配置使其正确持续。]

您应该注意,通过映射到帐户,您已经有效地将其添加到帐户列表中。当数据库下次查询以创建该列表时,它将通过查找来自帐户实体的引用来填充该列表

简而言之->

public void Group.setAccounts(Account a)
{
  this.account = a;
}
实际上相当于您在上面所做的。数据库将查询列表并使用类似于以下内容的内容填充列表:

//Pseudo SQL
    SELECT g.id FROM Group g WHERE g.account_id = :account_id
因此,除了延迟加载(您可能希望或不希望)之外,添加到组中是不必要的,因为列表是由查询定义的


(不要太难,它看起来很简单。我希望详细的解释能让你了解JPA正在发生什么)

在我们的项目中,我们通常试图避免双向关联

一个原因是,如果您想以某种方式对模型进行序列化,那么您的模型中有一个循环可能会产生问题,例如,假设您想序列化一个
帐户
,而您的序列化算法不够智能,您最终会遇到一个无限循环(因为
有一个对
帐户
的引用)

第二个原因是,我发现只有一种方式来导航模型更为清晰。我通常要做的是删除帐户实体中的OneToMany关联,并在需要收集特定
帐户的所有
时使用存储库调用(但这可能取决于您的用例和个人喜好)


第三,如果你放弃addToAccount方法,使用字段访问,你可以使你的类保持不变,这是一件好事。

我确实认为,你的大学所建议的做法是不好的。不仅是1或2(特别是2!),您还应该在构造函数中使用可重写方法,因为它可以在子类中有效重写,并在调用子对象构造函数之前被调用!。我确实相信你应该保持一个一致的对象图(内存模型),我正在研究如何最好地做到这一点,并克服这一点。。就是没法安静下来!。你终于找到答案了吗?
public void Group.setAccounts(Account a)
{
  this.account = a;
}
//Pseudo SQL
    SELECT g.id FROM Group g WHERE g.account_id = :account_id