首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在JPA中对一对多关系中的“默认选择”进行建模

如何在JPA中对一对多关系中的“默认选择”进行建模
EN

Stack Overflow用户
提问于 2016-08-27 04:10:10
回答 1查看 43关注 0票数 0

我有一个数据模型,在这个模型中,一个或多个Name可以知道一个Person (例如,一个女人在结婚后改变了自己的名字)。该模型区分活跃使用的单个Name

PersonName之间的一般关系像往常一样建模:Person实体中的双向@OneToMany关系和Name实体类中相应的@ManyToOne关系。

为了指定“活动或主要名称”,我认为我可以将其建模为从PersonName的单向@ the关系。实体类中的映射如下所示:

代码语言:javascript
运行
复制
public class Person {

    @Id @GeneratedValue(strategy = GenerationType.Identity)
    private Long pers_id;

    @OneToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "name_id", nullable = false)
    private Name uniPrimaryName;

        :
        :

    @OneToMany(mappedBy = "owningSidePerson", fetch = FetchType.LAZY, 
        cascade = CascadeType.ALL)
    private List<Name> mappedSideNames;

        :
        :
}

Name实体类:

代码语言:javascript
运行
复制
public class Name

    @Id @GeneratedValue(strategy = GenerationType.Identity)
    private Long name_id;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinTable (name = "XREF_NAMES_PERSON",
        joinColumns = @JoinColumn(name = "name_id", nullable = false),
        inverseJoinColumns = @JoinColumn(name = "pers_id", nullable = false))
    private Person owningSidePerson;

        :
        :
}

此模型的优点在于,它允许我从Person中通过简单的属性访问来访问主Name。它也应该更容易维护。缺点与序列化具有循环引用的Person实体有关,但无论是否存在单向关系,都会出现这个问题。

另一种模型是向Name实体添加active布尔型属性,并使用它来指示关系中的哪个实体是活动实体。缺点是维护属性不那么简单,而且获取active Name需要单独的数据库查询。

在我花时间在这个设计上之前,我想问一下以前是否有人尝试过这个设计。我对使用实体对象的对象模型有顾虑,该实体对象将同时存在于单向和双向关系中。

EN

回答 1

Stack Overflow用户

发布于 2016-08-27 09:31:33

我的建议是只保留人员与姓名(mappedSideNames)的关系,并删除由uniPrimaryName属性映射的关系,以确定姓名是否主要您可以为此创建一个命名查询,但您必须创建一种方法来区分您引用的主要姓名,因为您需要设置一个标志。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39174001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档