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 Таблица для конкретного класса сущностей.