1

Вопрос по jpa, string, class, entity – Как получить сущность в JPA по имени таблицы во время выполнения?

Можно ли определить имя класса сущности по собственному имени таблицы сущности?

Некоторая часть старого кода имеет толькоСтроковое значение таблицы (CUSM_LANGUAGE в этом примере), и мне нужнонайти имя класса сущности (LanguageEntity)

@Entity
@Table(name = "CUSM_LANGUAGE")
public class LanguageEntity implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
    @Column(name = "LANG_DESCRIPTION")
    private String description = null;
    ....
1 ответ
3

Я думаю, это сильно зависит от JPA, который вы используете.

В JPA 2.0 у вас есть класс:http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManagerFactory.html

В этом классе есть метод getMetamodel (), который, как я ожидаю, содержит всю информацию о вашей базе данных.

В метамодели (http://docs.oracle.com/javaee/6/api/javax/persistence/metamodel/Metamodel.html) у вас есть getEntities () вот как мы получаем: EntityType

Я не уверен, как получить из EntityType информацию о таблице, которую он использует. Но даже это не представляется возможным (в чем я сомневаюсь), вы можете сделать это, как описано ниже.

Поскольку у вас есть устаревший код, я ожидаю, что у вас JPA <2.0, у которого нет этого метода getMetamodel. Вот почему информация, которую вы можете получить о сущностях, сильно зависит от конкретного JPA, который вы используете.

Однако, если у вас есть несколько классов, которые вам нужны (и вы можете легко создать этот список), вы можете создать индекс самостоятельно:

String tableNameOfEntityClass = LanguageEntity.class.getAnnotation(Table.class).name();

Таким образом, вы можете поместить все классы, которые вам нужны, в список, а затем создать карту с ключом tableName и значением refering class.

Конечно, это не очень полезно без Metamodel, который я описал выше, потому что вы также можете создать готовую карту вместо List с классами сущностей.

Я работал с вашим советом по MetaModel, но мне не удалось получить точное имя таблицы. У меня есть еще один пост для этого. (stackoverflow.com/questions/21630213/...) После завершения я поделюсь решением.

от Dimitri Dewaele

Не могли бы вы поделиться тем, что вы нашли? или ты просто сделал это как я тебе сказал?

от zimi

Это выглядит многообещающе! У меня есть устаревший код, но я подключаю JPA 2.1

от Dimitri Dewaele

Похожие вопросы