【发布时间】:2021-01-02 19:48:39
【问题描述】:
假设我有一个Person 实体和一个Animal 实体; Person 可以有 两个 最喜欢的动物,Animal 只能有 一个 Person其他人喜欢/看到那只动物)。这是一个@OneToOne 映射:用于Person 中的两个Animal 字段和Animal 中的两个Person 字段。然而,在AnimalfirstPerson 中应该== 到secondPerson。有没有办法在 Animal 类中只使用一个 Person 字段来执行以下操作?
Person.java:
@Entity
@SequenceGenerator(name="PERSON_SEQ", sequenceName="person_sequence")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PERSON_SEQ")
private Long id;
@Column
private String name;
public Person() {}
@OneToOne
@JoinColumn(name = "firstAnimal")
private Animal firstAnimal;
@OneToOne
@JoinColumn(name = "secondAnimal")
private Animal secondAnimal;
//getters and setters
Animal.java:
@Entity
@SequenceGenerator(name="PRIVATE_SEQ", sequenceName="private_sequence")
public class Animal {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PRIVATE_SEQ")
private Long id;
@Column
private String name;
@OneToOne(mappedBy = "firstAnimal")
private Person firstPerson;
@OneToOne(mappedBy = "secondAnimal")
private Person secondPerson;
...
【问题讨论】:
-
如果正如您的问题所述,这两个引用都应引用相同的
Person,为什么您希望将两个OneToOne都设为双向? -
@SternK 那还有什么办法呢?
-
“一个人可以有 两个 最喜欢的动物 [...] 这是一个 @OneToOne 映射” → 这显然是一个矛盾。但是,如果您不明白为什么,请考虑一下:映射反映的是 实体 之间的关系,而不是特定字段之间的关系。如果一个
Person与多个(“许多”)Animals 相关,即如果SELECT * FROM ANIMAL WHERE FIRSTPERSON = xyz可能(通常将)返回“多”行,则Person和Animal之间的关系是一对多。 (我不会解释如何反映 @OneToMany 关系,因为你已经评论过你知道如何。) -
但在我的示例中,
SELECT * FROM ANIMAL WHERE FIRSTPERSON = xyz将返回 1 行。比如说,animals表将有两列 -firstperson和secondperson。如果 ID 为4的特定动物有一个人57作为firstperson,那么没有其他动物可以拥有这个人作为firstperson。同时57人将在firstanimal列中拥有动物4, -
@walen 并且没有其他人会拥有该动物,因为
firstanimal:select * from persons where firstanimal = 4将返回一行 id = 57,select * from animals where firstperson = 57将返回一行 id = 4
标签: java hibernate jpa inheritance orm