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;}
}
Другие вопросы по тегам