Hibernate 连接了目标继承的jpa一对多不保存子表上的键
我在JPA2上使用了这个模型,Hibernate4.3作为提供程序 人Hibernate 连接了目标继承的jpa一对多不保存子表上的键,hibernate,jpa,one-to-many,Hibernate,Jpa,One To Many,我在JPA2上使用了这个模型,Hibernate4.3作为提供程序 人 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID") private long id; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "ID") private List<Animal> animals; 猫 在ER
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ID")
private List<Animal> animals;
猫
在ER模型上:
Person:
ID
Animal:
ID
ID_ANIMAL
ANIMAL_TYPE
Cat:
ID
ID_ANIMAL
ANIMAL_TYPE
NAME
当我加载一个人并添加一个动物并更新这个人时,会发生一些奇怪的事情,操作是成功的,但我得到的是,在一对多hibernate上,只在超级表(动物)而不是子表(Cat)上保存这个人的ID
人:
ID-->1
您的映射应如下所示:
@Entity
@Table(name = "PERSON")
public class PERSON implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy="person")
private List<Animal> animals;
}
猫
在Cat表中保存person_id肯定是多余的,因为您可以通过Animal将Cat链接到person。您还使用了连接策略,因此不需要Discrimator列。您的冗余是正确的,但是这个例子只是为了讨论:我必须使用类似于公开的e legacy ER模型。同样,在连接策略中,您可以使用鉴别器列,这就节省了我在动物表上写入动物类型的时间。(对于上面的遗留解释)。我尝试过,但此解决方案无法解决暴露的问题:与以前相同的行为:ID仅保存在超级表(动物而不是猫)上。如前所述,您没有问题。这是预期的行为。在CAT中保存所有者id是多余的,因为您可以通过与动物的关系获得所有者。
Person:
ID
Animal:
ID
ID_ANIMAL
ANIMAL_TYPE
Cat:
ID
ID_ANIMAL
ANIMAL_TYPE
NAME
Animal:
ID --> 1
ID_ANIMAL --> 1
ANIMAL_TYPE --> Cat
Cat:
ID --> 0
ID_ANIMAL --> 1
ANIMAL_TYPE --> Cat
NAME --> name
@Entity
@Table(name = "PERSON")
public class PERSON implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy="person")
private List<Animal> animals;
}
@Entity
@Table(name = "ANIMAL")
@Inheritance(strategy = JOINED)
public class Animal implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID_ANIMAL")
private int idAnimal;
@ManyToOne
@JoinColumn(name = "ID_PERSON")
private Person person;
}
@Entity
@Table(name = "CAT")
public class Cat extends Animal
{
@Column(name = "NAME")
private String name;
}