У меня есть устаревшая схема, которую нельзя изменить. Я использую базовый класс для общих функций и содержит встроенный объект. Существует поле, которое обычно отображается во встроенном объекте, которое должно быть в идентификаторе постоянства только для одного (из многих) подклассов. Я создал новый класс идентификаторов, который включает его, но затем я получаю сообщение об ошибке, что поле отображается дважды. Вот пример кода, который сильно упрощен для поддержания здравомыслия читателя:
@MappedSuperclass
class BaseClass {
@Embedded
private Data data;
}
@Entity
class SubClass extends BaseClass {
@EmbeddedId
private SubClassId id;
}
@Embeddable
class Data {
private int location;
private String name;
}
@Embeddable
class SubClassId {
private int thingy;
private int location;
}
Я пытался использовать @AttributeOverride, но смог заставить его только переименовать поле. Я попытался установить для него значение updateable = false, insertable = false, но это не сработало при использовании в аннотации @AttributeOverride. См. ответ ниже для решения этой проблемы.
Я понимаю, что могу изменить базовый класс, но я действительно не хочу разбивать встроенный объект, чтобы отделить общее поле, поскольку это сделало бы окружающий код более сложным и потребовало бы какого-то уродливого кода-обертки. Я мог бы также перепроектировать всю систему для этого углового корпуса, но я бы не хотел этого делать.
Я использую Hibernate в качестве поставщика JPA.