Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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 对于这个实体层次结构,什么是好的持久性设计?_Java_Jpa_Entity - Fatal编程技术网

Java 对于这个实体层次结构,什么是好的持久性设计?

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

我是JPA新手,正在尝试为以下课程设计。所有类都覆盖了equals和hashcode、getter和setter以及空构造函数

我有一个适用于所有实体的基类:

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