#java #hibernate #enums #entity-relationship-model
#java #спящий режим #перечисления #сущность-отношение
Вопрос:
Я работаю над проектом, где у меня возникают проблемы с переносом моей модели взаимосвязи сущностей в Java-код. Я не совсем уверен, разрешено ли мне публиковать код здесь, поэтому я привел пример, который напоминает имеющуюся у меня проблематику.
Вот ERM, который я создал:
Предполагается, что Person и address являются классами, и у person должно быть ровно 2 адреса, поэтому я выбрал две переменные «HomeAdress» и «WorkingAdress» вместо списка или массива. Но поэтому я не уверен, как закодировать это отношение на Java, или если это вообще возможно, или если мне нужен другой подход. (Я нашел решение для этого при написании этого вопроса)
Хобби должно быть перечислением, и у Человека может быть несколько хобби или ни одного. И хобби может быть назначено нескольким лицам или никому. Я не совсем уверен, как назначать перечисления в отношениях «многие ко многим».
Я показываю вам код, который у меня есть на данный момент.
Хобби:
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "hobbies")
public enum Hobby {
FISHING("Fishing"),
HIKING("Hiking"),
FOOTBALL("Football"),
DANCING("Dancing"),
NETFLIX("Netflix");
private String description;
private Hobby(String description) {
this.description = description;
}
@Override
public String toString() {
return this.description;
}
}
Класс Person:
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name="name")
private String name;
@OneToMany(mappedBy="state", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Address homeAddress;
@OneToMany(mappedBy="state", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Address workingAddress;
@Enumerated(EnumType.STRING)
@Column(name="hobbies")
private Hobby[] hobbies;
}
Класс адреса:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "street")
private String street;
@Column(name = "city")
private String city;
@ManyToOne
@JoinColumns({
@JoinColumn(name= "workingAdress", nullable = false),
@JoinColumn(name= "homeAddress", nullable = false)
})
private Person person;
При написании этих вопросов я нашел аннотацию @JoinColumns, которая, похоже, решает одну из моих проблем. Теперь я могу назначить два возможных столбца объединения одной переменной.
Однако проблема с сопоставлением перечисления все еще остается. Потому что я получаю org.hibernate.Исключение AnnotationException при запуске этого кода. В нем говорится, что для объекта не указан идентификатор: Хобби.
Должен ли я реализовать идентификатор для перечисления? Не могу ли я использовать значение перечисления в качестве идентификатора? Или, может быть, все сопоставление является поддельным. Я надеюсь, что вы сможете мне помочь.
Также я рад любым советам, которые вы можете мне дать. Потому что я новичок в кодировании и стараюсь улучшить все, что могу.
Комментарии:
1. Я обнаружил ошибку, которую допустил, поскольку отношение между человеком и адресом на самом деле не один ко многим или многие к одному, а просто один к одному, поскольку у меня есть отдельные переменные для двух адресов и один адрес, принадлежащий только одному человеку.
Ответ №1:
Хорошо, после еще одного целого дня пробования разных вещей и попыток найти решение, я сдался и сделал хобби классом вместо перечисления. Теперь он работает нормально. Похоже, что сохранение массивов или коллекций перечислений в режиме гибернации является плохой практикой. Поскольку очень сложно найти какую-либо информацию об этом в Интернете, и если вы найдете ветку об этом, ей 10 лет, и решение больше не работает.