Как переопределить атрибут в унаследованных классах в JPA - PullRequest
0 голосов
/ 17 августа 2011

У меня есть общая структура базы данных, которая может хранить несколько пользовательских записей.Например, основной таблицей является RECORD, а столбцами являются STRING01, STRING02, [...], NUM01, NUM02 и т. Д.

Я знаю, что это немного странно, но у нее есть как преимущества, так и недостатки.Однако эта структура существует и не может быть изменена.Теперь я хочу создать несколько классов JPA.

Сначала я создал абстрактный класс RECORD следующим образом (аннотации помещены в getter, пример просто упрощен):

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING)
public abstract class Record {
    @Id
    private long id;

    @Column(name="STRING01")
    private String string01;

    @Column(name="STRING02")
    private String string02;

    @Column(name="NUM01")
    private BigDecimal num01;
}

Затем,Я создал определенные классы, унаследованные от RECORD:

@Entity
@DiscriminatorValue("Person")
public class Person extends Record {
    @Transient
    public String getFirstName() {
        return getString01();
    }

    public void setFirstName(String name) {
        setString01(name);
    }

    @Transient
    public BigDecimal getWeight() {
        return getNum01();
    }

    public void setWeight(BigDecimal weight) {
        setNum01(weight);
    }
}

Это прекрасно работает, так как я могу запросить RECORD для первичного ключа ЧЕЛОВЕКА (через EntityManager.find()) и получить Result в качестве экземпляра PERSON.Я могу запросить FirstName и Weight, не зная общих имен столбцов.

Однако, если я напишу свой собственный JPA-запрос, такой как SELECT p FROM Person p WHERE p.firstName = 'Michael', произойдет сбой.firstName является временным, и здесь я должен использовать общее имя string01.

Есть ли какой-нибудь способ переопределить имя атрибута базового класса в JPA?Может быть, есть решение для конкретного поставщика (я использую EclipseLink)?

1 Ответ

0 голосов
/ 17 августа 2011

Вы можете попробовать сопоставить несколько атрибутов в одном столбце. Дополнительный атрибут затем будет помечен @Column( name = "column name", insertable = false, updatable = false, nullable = false ).

В качестве альтернативы, вы можете заменить / усовершенствовать преобразователь JPQL для внутреннего сопоставления p.firstName с p.string01, но это будет зависеть от EclipseLink, и я не знаю, возможно ли это вообще. Воспринимайте это как подсказку, что искать.

...