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
Hibernate 连接了目标继承的jpa一对多不保存子表上的键_Hibernate_Jpa_One To Many - Fatal编程技术网

Hibernate 连接了目标继承的jpa一对多不保存子表上的键

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

我在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模型上:

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;
}