Java Hibernate继承,父类应该是基于decider的子类或父类
试图在Hibernate中实现继承 下面是模式 这里是什么,课程是什么Java Hibernate继承,父类应该是基于decider的子类或父类,java,hibernate,jpa,Java,Hibernate,Jpa,试图在Hibernate中实现继承 下面是模式 这里是什么,课程是什么 //Grand Parent Class @Entity @Table(name="grand_parent") public class GrandParent{//consider @id} //Parent Class @Entity @Table(name = "parent") @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColu
//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条父记录
- 如果决策者为“X/Y/Z”,需要保存4条记录,则应添加1条父记录和4条ChildX/ChildY/ChildZ记录
@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}
......
现在我得到一个错误:
应用程序错误:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'Child'不存在
使用(联接)继承时,在持久化子表时,将始终在父表和子表中插入一行。这意味着每个家长最多有一个孩子。
在表关系图中,有多个子项具有相同的父项,这不是继承,这是一个单域实体关系,由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
使用(联接)继承时,在持久化子表时,将始终在父表和子表中插入一行。这意味着每个家长最多有一个孩子。
在表关系图中,有多个子项具有相同的父项,这不是继承,这是一个单域实体关系,由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
孩子们不应该扩展父母吗?如果父母不能独立存在,你应该把它抽象化。更新了我的任务。是子级扩展父级子级不扩展父级吗?如果父母不能独立存在,你应该把它抽象化。更新了我的任务。是的,我试过了。。错误是表子级不存在。由于没有表'Child',实体没有问题,那么如何创建表呢?您还需要指定何时出现错误,如果是在持续出现错误时,代码的外观如何。我将编辑我的答案以包含JPA以保存父级和特定子级。只要您直接或通过级联持久化所有实体,代码看起来就很好。若并没有表子级,那个么检查create语句和数据库布局。如果您的表是由hibernate自动创建的(仅推荐用于开发),那么您可能需要删除数据库并从一个干净的数据库开始。AbstractEntityManagerImpl.java->用于持久化的函数persist(entity)。仍然没有线索。从你的帖子、评论和编辑来看,我认为你对JPA是相当陌生的。您是否尝试过用一个更简单的示例来学习基本知识,并在一个实体中构建解决方案?我已经在本地测试了代码,它可以正常工作,因此,除非您可以在GitHub上创建项目,以便我可以查看所有代码和配置,否则我无法再帮助您。我尝试了。。错误是表子级不存在。由于没有表'Child',实体没有问题,那么如何创建表呢?您还需要指定何时出现错误,如果是在持续出现错误时,代码的外观如何。我将编辑我的答案以包含JPA以保存父级和特定子级。只要您直接或通过级联持久化所有实体,代码看起来就很好。若并没有表子级,那个么检查create语句和数据库布局。如果您的表是由hibernate自动创建的(仅推荐用于开发),那么您可能需要删除数据库并从一个干净的数据库开始。AbstractEntityManagerImpl.java->用于持久化的函数persist(entity)。仍然没有线索。从你的帖子、评论和编辑来看,我认为你对JPA是相当陌生的。您是否尝试过用一个更简单的示例来学习基本知识,并在一个实体中构建解决方案?我已经在本地测试了代码,并且它可以工作,所以除非您可以在GitHub上创建项目,这样我就可以看到所有的代码和配置,否则我不能再帮助您了。
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();
}