JPA,如何使用同一个类(实体)映射不同的表格?

61

我有两个表:TaTb。它们的表结构完全相同,但是表名不同。

我想创建一个实体类来映射这些表的结构。我的一些通用应用程序模块将使用这个实体类根据参数动态查询和更新TaTb中的数据。在JPA中可以实现吗?我该如何编写程序,在运行时将实体类动态映射到不同的表?

3个回答

55

不确定您是否可以完全按照您的意愿进行操作,但是您可以使用继承来产生相同的结果。

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 {
...
}

9
可以,谢谢!但是对于Toplink来说,“TABLE_PER_CLASS”不被支持。我尝试使用"@mappedSuperClass"方法,也可以工作。 - John
6
如果有人对继承(Inheritance)和映射超类(MappedSuperClass)不确定,可以在这里找到很好的描述和比较:https://dev59.com/jWkw5IYBdhLWcg3wwdQS#9669719。 - SatA
我的表名不同,列类型相同但列名不同,例如一个表中的国家列被命名为domicile,在另一个表中被命名为country。列包含的是国家信息,但列名略有不同。我该如何修改此例以适应我的情况?有任何想法吗? - Sithija Piyuman Thewa Hettige

28
使用注释@MappedSuperclass创建一个抽象类(模板类),然后扩展它。每个扩展类都使用注释@Table,@Entity,并且仅包含空构造函数。所有代码将在您的父类中。 在您的方法中使用泛型指示您的参数实体从templateClass继承,并且不需要进行更多的代码更改。适当的映射将在每个传递的子代中。

通常,Son 与 Child 之间存在 IS-A 关系。 - Prabhat Gaur

9
如果您使用两个不同的持久化单元,也可以不使用子类来完成此操作。
每个持久化单元可以指定唯一的映射集(包括表名称)。实现此目的的一种方法是创建两个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>

您需要为每个PersistenceUnit创建单独的EntityManagerFactory(可能不是您想要的),但如果您想在不同的数据库上使用相同的类(具有不同的表名),这将是一种方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接