Как заставить 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 строки, что не соответствует ожиданиям.