JPA, Как использовать один и тот же класс (сущность) для сопоставления разных таблиц?
У меня две таблицы: Ta
и Tb
. Они имеют точно такую же структуру таблицы, но разные имена таблиц.
Я пытаюсь создать один класс сущности для сопоставления структур таблиц. Некоторые из моих общих модулей приложений будут использовать этот класс сущностей для динамического запроса и обновления либо Ta
, либо Tb
на основе параметров. Можно ли это сделать в JPA? Как я могу написать программу для динамического отображения класса сущности в разные таблицы во время выполнения?
Ответы
Ответ 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 (возможно, не того, что вы хотите), но если вы хотите использовать один и тот же класс в разных базах данных (с разными именами таблиц), это будет способом.