Hibernate 休眠一对多和多对多使用。如何引用现有值而不是插入已发布的

Hibernate 休眠一对多和多对多使用。如何引用现有值而不是插入已发布的,hibernate,duplicates,entity,one-to-many,many-to-one,Hibernate,Duplicates,Entity,One To Many,Many To One,如何强制Hibernate不将重复值插入感兴趣的表中,而只是引用现有值 以下是一个例子: 性别实体: @Entity(name = "genders") public class GenderEntity { @Id @Column(name = "gender_id") @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Enumerated(EnumType.STRING) @C

如何强制Hibernate不将重复值插入感兴趣的表中,而只是引用现有值

以下是一个例子:

性别实体:

@Entity(name = "genders")
public class GenderEntity {

  @Id
  @Column(name = "gender_id")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer id;

  @Enumerated(EnumType.STRING)
  @Column(name = "value")
  private GenderEnum value;

  @OneToMany(mappedBy = "gender", fetch = FetchType.EAGER)
  private Set<Person> genderNames = new HashSet<>();
}
NameWeightDescriptionEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  @Column(name = "name_id")
  private Integer id;

  @Column(name = "name", unique = true, nullable = false)
  private String name;

  @Column(name = "weight", nullable = false)
  private Short weight;

  @Column(name = "description", unique = true, nullable = false)
  private String description;


  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "gender_id")
  private GenderEntity gender;
}
这个想法是当一个人创造一个人时,将其性别设定为:

person.setGender(new GenderEntity() {{ setValue(GenderEnum.M); }});
Hibernate总是试图创造一个新的性别记录

需要做的是:Hibernate在数据库中插入的新记录与为GenderEntity提供的不同枚举值一样多。在我的例子中,只有2个,因为GenderEnum非常简单:

public enum GenderEnum {
  M,
  F
}
因此,如果有人在其代码中键入:

person1.setGender(new GenderEntity() {{ setValue(GenderEnum.M); }});
person2.setGender(new GenderEntity() {{ setValue(GenderEnum.F); }});
person3.setGender(new GenderEntity() {{ setValue(GenderEnum.M); }});
然后在GenderEntity的数据库表中只能创建两条记录


目前,将有3行不是预期的。

new类似,这是不可能的。唯一的解决方案显然是将GenderEntity创建移到person对象之外,以便在代码中引用它们


引用工作正常。

看起来与new类似,这是不可能的。唯一的解决方案显然是将GenderEntity创建移到person对象之外,以便在代码中引用它们

参考资料很好用