Подтвердить что ты не робот

JPA, Как использовать один и тот же класс (сущность) для сопоставления разных таблиц?

У меня две таблицы: Ta и Tb. Они имеют точно такую ​​же структуру таблицы, но разные имена таблиц.

Я пытаюсь создать один класс сущности для сопоставления структур таблиц. Некоторые из моих общих модулей приложений будут использовать этот класс сущностей для динамического запроса и обновления либо Ta, либо Tb на основе параметров. Можно ли это сделать в JPA? Как я могу написать программу для динамического отображения класса сущности в разные таблицы во время выполнения?

4b9b3361

Ответ 1

Не уверен, что вы можете сделать это точно так, как хотите, но вы можете использовать наследование для получения того же результата.

У AbsT есть все поля, но аннотация @Table

Ta и Tb наследуют от AbsT и имеют аннотацию @Table каждый

Используйте

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

в AbsT.

Пример кода:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class abstract AbsT {
    @Id Long id;
...
}

@Entity
@Table(name = "Ta")
public class Ta extends AbsT {
...
}

@Entity
@Table(name = "Tb")
public class Tb extends AbsT {
...
}

Ответ 2

Создайте абстрактный класс (класс шаблона) с аннотацией @MappedSuperclass и продолжите его. Каждый класс, который расширяет, использует @table, @entity аннотации и содержит только пустой конструктор. Весь код будет в вашем родительском классе. В ваших методах используются общие признаки, указывающие, что ваш объект параметра распространяется от templateClass, и больше не требуется никаких изменений кода. Собственные отображения будут у каждого вашего сына.

Ответ 3

Вы также можете сделать это, не используя подклассы, если вы используете два разных единицы сохранения.

Каждый блок персистентности может указывать уникальный набор сопоставлений (включая имя таблицы). Один из способов добиться этого - создать два файла orm.xml. В файле persistence.xml вам понадобится следующее:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="1.0">

    <persistence-unit name="mapping-1"> 
        . . .
        <mapping-file>orm-1.xml</mapping-file>
        . . .
    </persistence-unit>

    <persistence-unit name="mapping-2"> 
        . . .
        <mapping-file>orm-2.xml</mapping-file>
        . . .
    </persistence-unit>
</persistence>

Затем в orm-1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
    version="1.0">
    <package>mypackage</package>
    <entity name="myEntity" class="myClass">
        <table name="TABLE1">
            </table>
    </entity>
</entity-mappings>

И внутри orm-2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
    version="1.0">
    <package>mypackage</package>
    <entity name="myEntity" class="myClass">
        <table name="TABLE2">
            </table>
    </entity>
</entity-mappings>

Вам потребуется создать отдельный EntityManagerFactory для каждого PersistenceUnit (возможно, не того, что вы хотите), но если вы хотите использовать один и тот же класс в разных базах данных (с разными именами таблиц), это будет способом.