Как мне сопоставить перечисления в отношениях «многие ко многим»

#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 лет, и решение больше не работает.