Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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 Hibernate继承,父类应该是基于decider的子类或父类_Java_Hibernate_Jpa - Fatal编程技术网

Java Hibernate继承,父类应该是基于decider的子类或父类

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

试图在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条父记录
  • 如果决策者为“X/Y/Z”,需要保存4条记录,则应添加1条父记录和4条ChildX/ChildY/ChildZ记录

但是,当decider为“K”时,父表应视为单个子表,当decider为“X/Y/Z”时,父表必须作为父表

但在上面的类图中,只要决策器是“X/Y/Z”,就会在ChildX/ChildY/ChildZ中保存4条记录,在父表中没有记录

以及如何检索上述记录

编辑

@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();
}