Java JPA实体:如何在父类和多个子类之间建立关系
我有以下Java类: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 {
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继承的更多信息 请点击此处:
关于JPA继承的更多信息 请点击此处:
关于JPA继承的更多信息 请点击此处:
关于JPA继承的更多信息 请点击此处:
@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
}