Hibernate继承,父类应该是基于决定者的子类或父类

问题描述:

试图在Hibernate中实现继承。Hibernate继承,父类应该是基于决定者的子类或父类

以下是架构

enter image description here

这里是什么类是,

//Grand Parent Class 
@Entity 
@Table(name="grand_parent") 
public class GrandParent{//consider @id} 

//Parent Class 
@Entity 
@Table(name = "parent") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "decider", discriminatorType = DiscriminatorType.STRING) 
public class Parent{//consider @id} 

//ChildX class 
@Entity 
@Table(name = "childX") 
@PrimaryKeyJoinColumn(name="id") 
@DiscriminatorValue("X") 
public class ChildX() extends Parent{//consider value} 

//ChildY class 
@Entity 
@Table(name = "childY") 
@PrimaryKeyJoinColumn(name="id") 
@DiscriminatorValue("Y") 
public class ChildY extends Parent(//consider value){} 

//ChildZ class 
@Entity 
@Table(name = "childZ") 
@PrimaryKeyJoinColumn(name="id") 
@DiscriminatorValue("Z") 
public class ChildZ() extends Parent{//consider value} 

使用案例:

  • 如果判定为 'K',和4记录需要保存,那么4个父记录应该是a dded
  • 如果决定者是'X/Y/Z',并且需要保存4条记录,那么应该添加1条父记录和4条ChildX/ChildY/ChildZ记录。

enter image description here

然而,父表应该被视为一个孩子时,决胜局是“K”,当判定为“X/Y/Z”

但它必须充当父上面的类图中,每当决策者为'X/Y/Z'时,4个记录保存在ChildX/ChildY/ChildZ中,父表中没有记录。

另外如何检索上面的记录。

EDITS

@Entity 
@Table(name="grand_parent") 
public class GrandParent{ 
    @OneToMany(mappedBy = "parentRecord", 
     fetch = FetchType.LAZY, 
     cascade = CascadeType.ALL) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE) 
private List<parent> parentList; 
} 

//Parent Class 
@Entity 
@Table(name = "parent") 
public class Parent{ 
@ManyToOne() 
@JoinColumn(name = "fk_gp_id") 
private GrandParent parentRecord; 

@OneToMany(mappedBy = "childrecord", 
     fetch = FetchType.LAZY, 
     cascade = CascadeType.ALL) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE) 
private List<Child> childList; 
} 

@Entity 
@DiscriminatorColumn(name = "decider", discriminatorType = DiscriminatorType.STRING) 
public abstract class Child(){ 
@ManyToOne(optional = false) 
@JoinColumn(name = "fk_parent_id") 
private parent childrecord; 
} 

//ChildX class 
@Entity 
@Table(name = "childX") 
@DiscriminatorValue("X") 
public class ChildX() extends Parent{//consider value} 
...... 

要添加..

GrandParent gp = new GrandParent(); 
Parent p = new Parent(); 
ChildX ch = new ChildX(); 
ch.setChildrecord(p); 
p.setChildList(//Array added ch); 
p.setParentRecord(gp); 
gp.setParentList(//Array added p); 
persist(gp); 

现在我得到一个错误:

Application error : com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'Child' doesn't exist

+0

孩子们不应该延长家长吗?如果'''Parent'''不能独立存在,你应该把它抽象出来。 –

+0

更新了我的任务。是孩子延伸父母 –

当您使用(加入)继承,你总是插入当你坚持一个孩子时,在Parent和Child表中都有一行。这意味着每个父母最多只有一个孩子。 在你的表格图中,你有多个具有相同父代的孩子,这不是继承,这是一个OneToMany实体关系,这是由你的ER图确认的。

我的猜测是,你正在寻找的东西是这样的:

@Entity 
public class Parent { 
    @Id 
    private long id; 

    @OneToMany(mappedBy = "parent") 
    private Collection<Child> children; 
} 


@Entity 
@DiscriminatorColumn(name = "decider", discriminatorType = DiscriminatorType.STRING) 
public abstract class Child { 
    @Id 
    private long id; 

    @ManyToOne 
    private Parent parent; 
    // other common fields 
} 

@Entity 
@DiscriminatorValue("X") 
public class ChildX extends Child { 
    // specific fields for child x 
} 

// more children types 

家长可以有很多的孩子,这些孩子可以是不同类型的。子基类有引用父项的外键列,在我的经验中,继承基类通常最终是抽象的。

编辑:下面是一个存储父和特定子代码的示例。

EntityManager em = emf.createEntityManager(); 
try { 
    em.getTransaction().begin(); 
    Parent p = new Parent(); 
    ChildX childX = new ChildX(); 
    childX.setParent(p); 
    em.persist(p); 
    em.persist(childX); 
    em.getTransaction().commit(); 
} finally { 
    em.close(); 
} 
+0

我尝试了..错误是表格孩子不存在。由于没有表'子' –

+0

实体没有问题,所以如何创建表?此外,您需要指定何时出现错误,以及是否持续存在时,代码的外观如何。我将编辑我的答案,以包含JPA以保存父项和特定的子项。 –

+0

更新了我的问题......谢谢 –