我有一个数据模型,在这个模型中,一个或多个Name可以知道一个Person (例如,一个女人在结婚后改变了自己的名字)。该模型区分活跃使用的单个Name。
Person和Name之间的一般关系像往常一样建模:Person实体中的双向@OneToMany关系和Name实体类中相应的@ManyToOne关系。
为了指定“活动或主要名称”,我认为我可以将其建模为从Person到Name的单向@ the关系。实体类中的映射如下所示:
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实体类:
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需要单独的数据库查询。
在我花时间在这个设计上之前,我想问一下以前是否有人尝试过这个设计。我对使用实体对象的对象模型有顾虑,该实体对象将同时存在于单向和双向关系中。
发布于 2016-08-27 09:31:33
我的建议是只保留人员与姓名(mappedSideNames)的关系,并删除由uniPrimaryName属性映射的关系,以确定姓名是否主要您可以为此创建一个命名查询,但您必须创建一种方法来区分您引用的主要姓名,因为您需要设置一个标志。
https://stackoverflow.com/questions/39174001
复制相似问题