Спящий режим: сопоставление без ограничения внешнего ключаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Спящий режим: сопоставление без ограничения внешнего ключа

Сообщение Anonymous »

У меня есть таблица eventchangelog и таблица user, и я пытаюсь сопоставить объект User с записью eventChangeLog на основе столбца имени пользователя. В таблице пользователей имя пользователя является уникальным полем, но по деловым причинам я не могу добавить ограничение внешнего ключа между eventchangelog.createdby и user.username.
Проблема
Я хочу сохранить только имя пользователя в журнале событий, но хотел бы, чтобы Hibernate загружал весь объект пользователя (имя, фамилия, имя пользователя и т. д.) при получении записи EventChangeLog. Однако у меня возникают проблемы с сопоставлением пользователя с моим классом EventChangeLog, если я не использую конструктор в своем запросе HQL.
Вот с чем я работаю:
Класс EventChangeLog

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

@NoArgsConstructor
@Getter
@Setter
public class EventChangeLog {
private long id;
private Event event;
private String createdByUsername;
private User createdBy;

// Constructor initializes all fields except `id`
}
Сопоставление EventChangeLog в спящем режиме

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




eventchangelog_sequence









Класс пользователя

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

@NoArgsConstructor
@Getter
@Setter
public class User {
private String username;
private String surname;
private String firstName;
}
Сопоставление спящего режима пользователя Попытки выполнения запросов

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

When I use this HQL query with a constructor, it maps everything correctly:

String hql = """
select new org.event.EventChangeLog(
ecl.event,
ecl.createdByUsername,
ecl.createdBy
)
from EventChangeLog ecl
join ecl.event e
left join ecl.createdBy
where e.uid = :eventUid
""";
Однако, если я использую следующий запрос, который должен сопоставляться непосредственно с EventChangeLog, объект User (createdBy) не отображается:

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

String hql = """
select ecl
from EventChangeLog ecl
join ecl.event e
left join ecl.createdBy
where e.uid = :eventUid
""";
Что я пробовал
  • Ограничение внешнего ключа: добавление внешнего ключа не помогло не работает из-за бизнес-ограничений.
  • Сопоставление первичного ключа: сопоставление по user.id также не работает.
  • Eager против ленивой выборки: Оба подхода не изменили результат.
  • Использование CriteriaQuery вместо HQL: результат тот же; Пользователь не получен.
  • Журналы гибернации: запрос на соединение кажется правильным и выглядит одинаково в обоих случаях, поэтому я подозреваю, что проблема в конфигурации сопоставления.
Как настроить Hibernate для сопоставления объекта User с EventChangeLog с использованием столбца имени пользователя без использования конструктора в моем запросе HQL?

Подробнее здесь: https://stackoverflow.com/questions/791 ... constraint
Ответить

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

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

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

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

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