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

Посмотрите на это: http://www.perlmonks.org/?node_id=17890

(взято оттуда:)

Perl реализует списки с массивом и смещением первого / последнего элемента. Массив выделяется больше, чем необходимо, смещения, изначально указывающие на середину массива, так что есть место для роста в обоих направлениях (unshifts и push / вставки), прежде чем потребуется перераспределение базового массива. Следствием этой реализации является то, что все операторы примитивного списка perl (вставка, выборка, определение размера массива, push, pop, shift, unshift и т. Д.) Выполняются за O (1) времени.

43
задан huzeyfe 24 December 2015 в 11:32
поделиться

2 ответа

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

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 {
...
}
45
ответ дан 26 November 2019 в 22:55
поделиться

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

Каждая единица сохранения состояния может указывать уникальный набор отображений (включая имя таблицы). Один из способов добиться этого - создать два файла 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 ( возможно, это не то, что вы хотите), но если вы хотите использовать один и тот же класс в разных базах данных (с разными именами таблиц), это будет выход.

7
ответ дан 26 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

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