Hibernate один-ко-многим и многим в использовании. Как ссылаться на существующие значения вместо вставки опубликованных - PullRequest
0 голосов
/ 06 ноября 2019

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

1 Ответ

0 голосов
/ 06 ноября 2019

Похоже, с new это невозможно. Очевидно, что единственным решением является перемещение GenderEntity создания за пределы person объектов для ссылки на них в коде.

Ссылки работают отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...