Hibernate - Сбой с двумя @OneToMany - PullRequest
0 голосов
/ 27 августа 2018

Сбой Hibernate при использовании нескольких записей @OneToMany в моем Users.entity, и я не понимаю, почему.

У меня есть таблица для пользователей (первичный ключ userID) и различные другие таблицы, которые ссылаются на первичный ключ userID по внешнему ключу, установленному в базе данных (набор InnoDB и внешний ключ установлены в каждой зависимой таблице).

Вот пример с тремя таблицами:

Пользователи таблицы:

CREATE TABLE `users` (`userID` int(11) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
ALTER TABLE `users` ADD PRIMARY KEY (`userID`);

Таблица: запросы на отдых

CREATE TABLE `vacationrequests` (`requestID` int(11) NOT NULL,`userID` int(4) NOT NULL,) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `vacationrequests` ADD CONSTRAINT `userID` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON UPDATE CASCADE; COMMIT;

Таблица monthend:

CREATE TABLE `monthend` (`monthendID` int(11) NOT NULL,`userID` int(4) NOT NULL,) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Пользователи сущностей:

@Entity
@Table(name="users")

public class Users {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="userID")
private int userID;

... .... (other variables)

@OneToMany(fetch = FetchType.LAZY, mappedBy="monthend")
private Set<Monthend> monthend;

@OneToMany(fetch = FetchType.LAZY, mappedBy="vacationrequests")
private Set<Vacationrequests> vacationrequests;

public Users() {

}

Заявка на отпуск для юридических лиц:

@Entity
@Table(name="vacationrequests")

public class Vacationrequests {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="requestID")
private int requestID;

... .... (other variables)

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="userID", nullable = false)
private Users users;

public Vacationrequests() {

}

Сущность Monthend:

@Entity
@Table(name="monthend")

public class Monthend {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="monthendID")
private int monthendID;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="userID", nullable = false)
private Users users;

@Column(name="clientID")
private int clientID;

@Column(name="month")
private int month;

@Column(name="year")
private int year;

@Column(name="monthend")
private int monthend;

public Monthend() {

}

Рабочий запрос:

List<Object> listJoinUsersMonthend = session.createQuery("from Monthend m inner join m.users as users where m.clientID = :clientID AND m.year = :year AND users.loginclass = 0 AND users.isactive = 1 AND m.monthend = 0 AND m.month < :month order by users.userID asc")
                        .setInteger("clientID", user.getClientID())
                        .setInteger("year", year)
                        .setInteger("month", month)
                        .getResultList();           

Этот второй запрос, который я хотел бы интегрировать:

List<Object> listJoinVacationrequestsUsers = session.createQuery("from Vacationrequests v inner join v.users as users where v.clientID = :clientID AND v.approved=0 AND v.vacationtype=1 AND YEAR(v.startdate) = :year" )
                        .setInteger("clientID", user.getClientID())
                        .setInteger("year", year)
                        .getResultList();       

Все отлично работает только с одним запросом и одной записью в Users.entity. Как только я добавляю две записи, hibernate просто вылетает и сообщения об ошибке нет. Разве нельзя сделать два оператора @OneToMany в сущности?

1 Ответ

0 голосов
/ 27 августа 2018

Кажется, что проблема в отображении ассоциаций в сущности Users.Вы должны изменить атрибут mappedBy ассоциаций, чтобы указать имя поля, которое ссылается на текущий объект в ассоциированном (в данном случае users ), например:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "users")
private Set<Monthend> monthend;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "users")
private Set<Vacationrequests> vacationrequests;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...