Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 JPA实体:如何在父类和多个子类之间建立关系_Java_Jpa_Ejb - Fatal编程技术网

Java JPA实体:如何在父类和多个子类之间建立关系

Java JPA实体:如何在父类和多个子类之间建立关系,java,jpa,ejb,Java,Jpa,Ejb,我有以下Java类: public Class Parent { int someValue1; ChildType child; } public Class ChildType { int someValue2; } public Class ChildA extends ChildType { int id; String string; } public Class ChildB extends ChildType {

我有以下Java类:

public Class Parent {

    int someValue1;

    ChildType child;
}


public Class ChildType {

     int someValue2;
}


public Class ChildA extends ChildType {

     int id;

     String string;
}



public Class ChildB extends ChildType {

    int id;

    Integer integer;
}
我需要将Parent、ChildA和ChildB表示为实体bean,每个bean在数据库中都有一个相关的表


加载父对象时,我还需要根据关系加载ChildA或ChildB。

如果我正确,类父对象是一个与ChildType实体保持一对一关系的实体。另外,ChildType是一个抽象实体,有两个实现:ChildA和ChildB

因此,每个实体的JPA注释配置可能如下所示:

最后我们有了ChildA和ChildB 正如您所见,ChildType子类上不需要id字段,因为 他们从ChildType继承此字段


关于JPA继承的更多信息 请点击此处:


如果我没弄错的话,类父类是一个实体,它与ChildType实体保持一对一的关系。另外,ChildType是一个抽象实体,有两个实现:ChildA和ChildB

因此,每个实体的JPA注释配置可能如下所示:

最后我们有了ChildA和ChildB 正如您所见,ChildType子类上不需要id字段,因为 他们从ChildType继承此字段


关于JPA继承的更多信息 请点击此处:


如果我没弄错的话,类父类是一个实体,它与ChildType实体保持一对一的关系。另外,ChildType是一个抽象实体,有两个实现:ChildA和ChildB

因此,每个实体的JPA注释配置可能如下所示:

最后我们有了ChildA和ChildB 正如您所见,ChildType子类上不需要id字段,因为 他们从ChildType继承此字段


关于JPA继承的更多信息 请点击此处:


如果我没弄错的话,类父类是一个实体,它与ChildType实体保持一对一的关系。另外,ChildType是一个抽象实体,有两个实现:ChildA和ChildB

因此,每个实体的JPA注释配置可能如下所示:

最后我们有了ChildA和ChildB 正如您所见,ChildType子类上不需要id字段,因为 他们从ChildType继承此字段


关于JPA继承的更多信息 请点击此处:




你想把你的bean映射到现有的表吗?看看这个,如果需要的话,我愿意更改表谢谢链接,显然使用
@DiscriminatorColumn
是我所需要的。同样的,有多种策略可供选择。这是一个很好的链接,你是否正在尝试将你的bean映射到现有的表?看看这个,如果需要的话,我愿意更改表。感谢链接,显然使用
@DiscriminatorColumn
是我所需要的。有各种策略可用于相同的目的。这是一个很好的链接,你是否正在尝试将你的bean映射到现有的表?看看这个,如果需要的话,我愿意更改表。感谢链接,显然使用
@DiscriminatorColumn
是我所需要的。有各种策略可用于相同的目的。这是一个很好的链接,你是否正在尝试将你的bean映射到现有的表?看看这个,如果需要的话,我愿意更改表。感谢链接,显然使用
@DiscriminatorColumn
是我所需要的。有各种策略可用于相同的目的。这是一个很好的链接。这是否意味着ChildA和ChildB的id是自动生成的,并且是独立的,因为每个孩子都是一个带有id的表?我通常在id中声明
@GeneratedValue(strategy=GenerationType.IDENTITY)
,而不是
@GeneratedValue(strategy=GenerationType.table)
“这是否意味着。。。使用其id?”-是的,因为它们只是从其超类继承定义的属性。“我通常声明…”-我这样做是为了确保id的唯一性(如您所愿)。我认为,使用GenerationType.IDENTITY,您将在代码中获得更类似多态性的结果,因为每次提交ChildType类型的新实体时,id都会增加,而不是独立地作为ChildA或ChildB。您可以在这里检查它:谢谢,最后一件事。因为
@JoinColumn(name=“FK\u PARENT\u id”)
指向ChildA或ChildB,似乎我需要两列而不是一列,第一列将告诉我子类型,而第二列将告诉我该子类型的id。我的假设正确吗?如果我使用
@heritance(strategy=InheritanceType.JOINED),我将得到
未找到的ChildType表
如果我替换为
@heritance(strategy=heritancetype.TABLE\u PER\u CLASS)
错误消失了这是否意味着ChildA和ChildB的id是自动生成的,并且是独立的,因为每个子级都是一个具有id的表?我通常声明
@GeneratedValue(strategy=GenerationType.IDENTITY)
在要顺序生成的id中,而不是
@GeneratedValue(strategy=GenerationType.TABLE)
“这是否意味着。。。使用其id?”-是的,因为它们只是从其超类继承定义的属性。“我通常声明…”-我这样做是为了确保id的唯一性(如您所愿)。我认为,使用GenerationType.IDENTITY,您将在代码中获得更类似多态性的结果,因为每次提交ChildType类型的新实体时,id都会增加,而不是单独作为ChildA或ChildB。您可以在此处检查:谢谢,最后一件事。因为
@JoinColumn(name=“FK\u PARENT\u id”)
指向ei Parent class as Entity
@Entity
@Table(name = "PARENT")
public class Parent { // better name will do the job, because parent is often called
                      // the higher level class of the same hierarchy
  @Id
  @GeneratedValue
  @Column(name = "PARENT_ID")
  private long id;

  @Column(name = "SOME_VALUE") //if you need to persist it
  private int someValue1;

  @OneToOne(optional = false, cascade = CascadeType.ALL)
  @JoinColumn(name = "FK_PARENT_ID")
  private ChildType child;

  // getters and setters
}
ChildType class as Entity
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class ChildType { // this one is actually called parent class

  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  @Column(name = "CHILDTYPE_ID")
  protected Long id;

  @Column(name = "SOME_VALUE_2")
  private int someValue2; // or maybe protected. Depends if you need childs to access it

  @Column(name = "A_STRING")
  private String string; // or maybe protected. Depends if you need childs to access it
  
  // getters and setters
}
ChildA as Entity
@Entity
@Table(name = "CHILD_A")
public Class ChildA extends ChildType {
  
  @Column(name = "A_STRING")
  private String string;
  
  // getters and setters
}
ChildB as Entity
@Entity
@Table(name = "CHILD_B")
public Class ChildB extends ChildType {
  
  @Column(name = "AN_Integer")
  private Integer integer;
  
  // getters and setters
}