Java Hibernate многие ко многим не полностью обновляется - PullRequest
0 голосов
/ 23 мая 2018

Я все еще довольно новичок в Hibernate, и я все еще нахожусь на крутой кривой обучения.У меня есть приложение, которое будет отслеживать, какие люди были на каком мероприятии и наоборот.У меня есть класс событий и класс Person, связанные через объединяемую таблицу.

У меня есть формы и вспомогательные классы, которые позволяют мне вводить данные в отдельные классы Person и Event, сохранять их, искать их, удалять,измените это и перечислите это.Это все проверено и работает.

Когда я добавляю людей в событие, я могу перечислить все события и видеть список людей, прикрепленных к событиям, но когда я выводю список людей, у них у всех появляется список событий размером 0.

Насколько я понимаю, если я присоединяю человека к событию, которое должно появиться в Event.myPeople, и что это событие должно отображаться в Person.eventList.

Очевидно, что я делаю что-то не таки я подозреваю, что это в моих аннотациях и декларациях.Я перечислил оба набора для классов Event и Person ниже.В случае неудачи из-за фундаментального недопонимания Hibernate, скорее всего, оба.С другой стороны, чем больше ошибок я совершаю, тем быстрее учусь.

Есть идеи, где я ошибаюсь?

@Entity
@Table(name = "PERSON")    
public class Person implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "person_id")
    private int ID;
    private String foreName;
    private String surName;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dob;       //used to differentiate people with same name
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date joinDate;  //used to filter events outside active dates
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date endDate;   //used to filter events outside active dates
    private Boolean active;
    @ManyToMany()//cascade=CascadeType.ALL)
    @JoinTable(name = "PERSON_EVENT", joinColumns = @JoinColumn(name = "person_id"),
            inverseJoinColumns = @JoinColumn(name = "event_id"))
    private Set<Event> eventList;
    @OneToOne
    private Sections mySection;


@Entity
@Table(name = "EVENT")
public class Event implements Serializable {

    @Id
    @GenericGenerator(name = "generator", strategy = "increment")
    @GeneratedValue(generator = "generator")
    @Column(name="event_id")
    private long id;
    private String eventTitle;
    private String eventDescription;
    private String eventLocation;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date startDate;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date endDate;
    @ManyToMany(cascade = CascadeType.ALL)
    private Set<Person> myPeople;
    @OneToMany(mappedBy = "myEvent")
    private Set<EventType> type;

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Существует распространенное заблуждение о двунаправленных отношениях в Hibernate.Hibernate не заботится о согласованности в вашем дереве объектов.Если между событиями и людьми существует двунаправленная связь, вы должны добавить этого человека к событию, а событие - к себе.Hibernate сохраняет только то, что вы создали в памяти.Не ожидайте, что Hibernate добавит какой-либо объект в какие-либо коллекции, это является обязанностью бизнес-логики, которая не должна полагаться на Hibernate для правильной работы.

Теперь двунаправленные отношения отличаются тем, что несовместимые состояния в памяти даже не могут сохраняться.При наличии согласованных данных Hibernate должен сохранять только один сайт двунаправленной связи, поскольку другой является (или должен быть) избыточным.Это сделано, помечая одну часть как "обратную" часть.(Мне жаль, что я недостаточно хорошо знаю синтаксис сопоставления аннотаций, чтобы указывать на возможную ошибку в вашем сопоставлении.) "Инвертировать" означает для Hibernate не более, чем "игнорировать при синхронизации с базой данных", поскольку ожидается, что он будетизбыточный.

Вам все еще нужно убедиться, , что информация в обеих коллекциях избыточна.Это на самом деле «работает», когда вы только добавляете элементы в неинверсные коллекции.Но, однако, это не рекомендуется делать, потому что объекты не будут согласованы, пока не будут сохранены и загружены в новый сеанс.

Также убедитесь, что двунаправленное отношение сопоставлено с той же таблицей с использованием тех же внешних ключей,Я не знаю, если аннотирование сопоставления обнаруживает это автоматически.

Надеюсь, это поможет.

0 голосов
/ 23 мая 2018

Вы можете попробовать использовать: @ManyToMany(fetch = FetchType.LAZY)

0 голосов
/ 23 мая 2018

Проблема должна быть связана с отсутствием поля mappedBy в ассоциациях many to many.

Поле, которому принадлежит отношение, обязательно, если отношение не является однонаправленным.

Я думаю, добавление (mappedBy = eventList) будет достаточно.

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