JPA MappedSuperclass с ManyToOne

Я сталкиваюсь с типичной проблемой. Представьте типичные 1-N отношения между объектами. Чтобы быть точным Пользователь (U) и Комната (R): [U]*---1[R].

Здесь возникает проблема: Room должен быть абстрактным базовым классом с реализациями, например BlueRoom, RedRoom. Как правильно установить отношения внутри сущности пользователя?

public interface Room { ... }
@MappedSuperclass
public abstract class RoomSuperclass implements Room { ... }
@Entity
public class BlueRoom extends RoomSuperclass { ... }
@Entity
public class RedRoom extends RoomSuperclass { ... }


@Entity
public class User {

  @ManyToOne(targetEntity = ???) // I don't know if it will be BlueRoom or RedRoom
  private Room room; // ManyToOne cannot be applied on mapped superclass
}

Я знаю, что это, вероятно, можно решить, используя @Entity для RoomSuperclass вместо @MappedSuperclass, но я не уверен, является ли это хорошим решением и есть ли какое-нибудь лучшее.

2 ответа

Решение

По комментариям под постом. Объявление суперкласса как @Entity является решением.

Суперкласс, помеченный , не должен быть помечен .

Аннотации отношений можно использовать только с классом, имеющим аннотацию .

Вы можете заменитьMappedSuperclassаннотация сInheritance(strategy = InheritanceType.TABLE_PER_CLASS)и добавьтеEntityаннотация к вашему суперклассу.

Таким образом, спящий режим создаст таблицу базы данных для каждого класса. есть и другие стратегии, с которыми вы можете ознакомиться в официальной документации .

JOINED Стратегия, при которой поля, специфичные для подкласса, сопоставляются с отдельной таблицей, а не с полями, общими для родительского класса, и выполняется соединение для создания экземпляра подкласса.

SINGLE_TABLE Одна таблица для каждой иерархии классов.

TABLE_PER_CLASS Таблица для конкретного класса сущностей.

Другие вопросы по тегам