Hibernate继承,父类应该是基于决定者的子类或父类
试图在Hibernate中实现继承。Hibernate继承,父类应该是基于决定者的子类或父类
以下是架构
这里是什么类是,
//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记录。
然而,父表应该被视为一个孩子时,决胜局是“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
当您使用(加入)继承,你总是插入当你坚持一个孩子时,在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();
}
我尝试了..错误是表格孩子不存在。由于没有表'子' –
实体没有问题,所以如何创建表?此外,您需要指定何时出现错误,以及是否持续存在时,代码的外观如何。我将编辑我的答案,以包含JPA以保存父项和特定的子项。 –
更新了我的问题......谢谢 –
孩子们不应该延长家长吗?如果'''Parent'''不能独立存在,你应该把它抽象出来。 –
更新了我的任务。是孩子延伸父母 –