Java 对于这个实体层次结构,什么是好的持久性设计?
我是JPA新手,正在尝试为以下课程设计。所有类都覆盖了equals和hashcode、getter和setter以及空构造函数 我有一个适用于所有实体的基类:Java 对于这个实体层次结构,什么是好的持久性设计?,java,jpa,entity,Java,Jpa,Entity,我是JPA新手,正在尝试为以下课程设计。所有类都覆盖了equals和hashcode、getter和setter以及空构造函数 我有一个适用于所有实体的基类: public abstract class BaseEntity { protected Point loc; protected List<Property> properties = new ArrayList<>(); } public abstract class LivingEntity
public abstract class BaseEntity {
protected Point loc;
protected List<Property> properties = new ArrayList<>();
}
public abstract class LivingEntity extends BaseEntity {
public static enum Status { ALIVE, DECEASED }
int id;
Status status;
}
属性类包含名称和id:
public class Property {
private int id;
private String name;
}
有3个类继承自BaseEntity
。第一个是房子。一所房子可以容纳一个家庭
家人很快就要露面了。第二个是所有生命实体的超类:
public abstract class BaseEntity {
protected Point loc;
protected List<Property> properties = new ArrayList<>();
}
public abstract class LivingEntity extends BaseEntity {
public static enum Status { ALIVE, DECEASED }
int id;
Status status;
}
其中包括
public class Family extends LivingEntity {
private House house;
private List<Minion> members;
}
所以层次图是
BaseEntity
|
/|\
/ | \
/ | \
House Tree LivingEntity
|
/ \
Family Member
组成图是
House <---> Family ---> {Member, Member, Member, ...}
^ | | |
|----------------------------
除了2@MappedSuperclass的冲突之外,我不知道我是否正确且明智地使用了注释。对于这个案例来说,什么样的设计才是好的呢?我不知道您的业务原因(对于一个完整的家庭而不仅仅是个人成员来说,拥有“活着”或“死亡”的身份似乎很奇怪),但对于所给出的示例,拥有以下内容似乎更现实:
BaseFixedObject -> Point
|
/|
/ |
/ |
House Tree
LivingEntity -> many Properties
|
/|
/ |
/ |
Member |
Family -> many Members
Property -> many BaseFixedObjects
财产将主要是一个财产上的资产集合——一个有院子的房子,可能有很多树。我不知道它是否会引用这一点,或者每棵树/每栋房子都有自己的观点——这取决于你的需要。或者,您可以取消属性,直接使用LivingEntity引用basedFixedObject
这些关系可能是双向的,因此一个财产可能会引用它所绑定的生存权,即一个“成员”或家庭。我不确定在这种模式下,是否需要家庭以外的共同所有权-
如果是,则一个属性可能需要允许多个所有者,从而使其成为多人关系
这样,你的家庭(很可能)有一个固定点的房子。它不需要引用点本身,因为您可以通过相关属性访问它。什么是
@OneToOne protected String name代码>?!一种关系是与另一个实体的关系。字符串不是“另一个实体”。主要JPA提供商的所有文档解释this@NeilStockton复制粘贴错误。修正了,需要再突破一点。正如您在前面提到的,您需要首先弄清楚这是一个实体,具有自己的标识,还是只是所属类(可嵌入类)数据的封装。但最重要的是你的业务规则。我真的不明白为什么树和家庭以及“成员”会有相同的基类。人不是根,因此可能与地址关联,但不是由地址定义的。@Chris Tree、Family和Member具有相同的基类,因为它们都有一个位置点和属性列表。不需要地址。理想情况下,该点类似于一个单例,它对于数据库中的所有条目都是相同的。点(5,6)与任何其他点(5,6)相同。这是否回答了关于要点的问题?它没有抓住要点:)。ID是一个不可变的字段,我不认为点对于一个家庭来说是不可变的,但我不知道你们的模型。听起来你只想要1分,所以你需要给它一个idenity,让你的对象模型引用它。使用X,Y作为复合PK是有意义的,因为您只需要一个带有这些坐标的点,但这意味着在引用该点的任何地方复制相同的信息-当您可以通过在这些字段上添加唯一约束来获得相同的行为时。树中的所有内容真的需要loc和属性吗?
@MappedSuperclass
public abstract class BaseEntity {
@Id
protected Point loc;
@OneToMany
protected List<Property> effects = new ArrayList<>();
}
@Entity
@IdClass(value = PointID.class)
public class Point {
@Id
private int x, y;
}
class PointID {
int x, y;
}
@Entity
public class Property {
@Id
protected int id;
protected String name;
}
@Entity
public class House extends BaseEntity {
@OneToOne
private Family family;
}
@Entity
public class Tree extends BaseEntity {
private String name;
}
@MappedSuperclass
public abstract class LivingEntity extends BaseEntity {
public static enum Status { ALIVE, DECEASED }
@Id
int id;
@Enumerated(EnumType.STRING)
Status status;
}
@Entity
public class Family extends LivingEntity {
@OneToOne // bidirectional? specify mappedBy?
private House house;
@OneToMany
private List<Minion> members;
}
@Entity
public class Member extends LivingEntity {
@ManyToOne // bidirectional? specify mappedBy?
private Family family;
private String name;
}
BaseFixedObject -> Point
|
/|
/ |
/ |
House Tree
LivingEntity -> many Properties
|
/|
/ |
/ |
Member |
Family -> many Members
Property -> many BaseFixedObjects