Hibernate Аннотации Как я могу переопределить / игнорировать унаследованный член id
Я расширяю от базового класса утилит, который отображает идентификатор на столбцы
@MappedSuperclass
public abstract class BaseDTO
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int id;
public int getId() {
return id;}
public void setId(int id) {
this.id = id;}
}
Этот класс используется во многих производных классах для обеспечения упрощенного доступа и операций к таблицам, содержащим столбцы идентификаторов. т.е.
BaseDTO->DBAbstractClass1->DBAbstract2->MyClassDTO
BaseDTO->DBAbstractClass1->DBAbstract3->AnotherADTO
BaseDTO->DBAbstractClass2->DBAbstract4->AnotherBDTO
и т.п.
Теперь я обнаружил, что у меня есть таблица, сопоставленная с MyClassDTO, которая не имеет столбца "id" (у него есть столбец с именем "identifier"), но из-за архитектурных ограничений, расширяющихся по обычным причинам:
[org.hibernate.util.JDBCExceptionReporter] SQL Error: 1054, SQLState: 42S22
[org.hibernate.util.JDBCExceptionReporter] Unknown column 'this_.id' in 'field list'
Я попытался переопределить элемент id как @Transient, добавить новый @Id и т. Д., Но всегда получаю ошибку выше.
Либо я нахожу способ "игнорирования" или замены унаследованного идентификатора, либо мне нужно скопировать мои унаследованные классы, а не расширять BaseDTO, чего должен избегать хороший программист.
Я видел нечто похожее на Hibernate: как переопределить атрибут из сопоставленного суперкласса, но я не уверен, что это решит мою точную проблему.
Это, вероятно, простое переопределение, но нужно быть осторожным, чтобы не было побочных эффектов. Любой берущий?
2 ответа
Я не нашел простого элегантного решения для этого.
Что я сделал, так это изменил иерархию, чтобы создать два класса HelperDTO, один из которых расширяет другой, а второй включает свойство id. HelperDTO не имеет члена Id, а HelperWithIdDTO имеет члена Id, т.е.
HelperDTO->MyClassDTO (classes that do not use id)
а также
HelperDTO->HelperWithIdDTO->OtherDTO (classes that use id)
Попробуйте переопределить в вашем подклассе с этими изменениями супер?
@MappedSuperclass
public abstract class BaseDTO
{
public int id;
public int getId() {
return id;}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public void setId(int id) {
this.id = id;}
}