Как обрабатывать несколько внешних ключей, ссылающихся на себя в HibernateJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как обрабатывать несколько внешних ключей, ссылающихся на себя в Hibernate

Сообщение Anonymous »

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

Код: Выделить всё

CREATE TABLE `person` (  `id` int PRIMARY KEY, `previous_person` int, `next_person` int);
ALTER TABLE `person` ADD FOREIGN KEY (`previous_person`) REFERENCES `person` (`id`);
ALTER TABLE `person` ADD FOREIGN KEY (`next_person`) REFERENCES `person` (`id`);
Моя сущность Java выглядит следующим образом:

Код: Выделить всё

@Entity
@Table(name = "`person`")
public class Person implements Serializable {
@Id
@Column(name = "id", nullable = false)
private Integer id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "next_person")
private Person nextPerson;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "previous_person")
private Person previousPerson;

public Person getNextPerson() {
return nextPerson;
}

public void setNextPerson(Person nextPerson) {
this.nextPerson = nextPerson;
}

public Person getPreviousPerson() {
return previousPerson;
}

public void setPreviousPerson(Person previousPerson) {
this.previousPerson = previousPerson;
}
}
Когда я пытаюсь получить все объекты, я получаю сообщение об ошибке. Причина: java.lang.OutOfMemoryError: требуемая длина массива 2147483639 + 1482 слишком велика< /p>
Код в классе PersonService для получения всех сущностей:

Код: Выделить всё

public List
 getAllPeople() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(Person.class);
Root rootEntry = cq.from(Person.class);
CriteriaQuery all = cq.select(rootEntry);
TypedQuery allQuery = entityManager.createQuery(all);
return allQuery.getResultList();
}
Как мне следует определять этот тип отношений или мне вообще не следует этого делать? В конце концов, я хотел бы иметь возможность ссылаться на person.nextPerson.someColumn, но мне не нужно идти дальше по цепочке person.nextPerson.nextPerson и т. д.
Я предполагаю, что мог бы перестать пытаться сопоставить nextPerson с сущностью, а вместо этого установить идентификатор, но мне хотелось бы ссылаться на nextPerson для каждого человека, так что это не мой желаемый подход.
Я хочу только загружать объекты, и мне не нужно сохранять или удалять какие-либо строки.
Я пробовал использовать различные связи, такие как OneToOne, но ошибка осталась прежней. Однако, насколько я могу судить, проблема заключается в цепочке отношений.
Использование типа активной выборки дает ту же ошибку.
Ошибки не возникает. выдается, если у меня есть только один ключ, например nextPerson, а не previousPerson, и объекты возвращаются правильно.

Подробнее здесь: https://stackoverflow.com/questions/786 ... -hibernate
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»