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

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

我尝试创build一个实体类来映射表结构。 我的一些常用应用程序模块将使用这个实体类根据参数dynamic查询和更新TaTb 。 可以在JPA中完成吗? 我如何编写程序在运行时将实体类dynamic映射到不同的表?

不知道你可以完全按照你想要的,但你可以使用inheritance产生相同的结果。

AbsT拥有所有字段,但没有@Table注释

Ta和Tb从AbsTinheritance,每个都有一个@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 { ... } 

用注解@MappedSuperclass创build一个抽象类(一个模板类),然后扩展它。 每个扩展的类都使用@table,@entity注释,并且只包含一个空构造函数。 所有的代码将在你的父类中。 在你的方法使用generics,指示你的参数实体从templateClass扩展,不需要更改代码。 适当的映射将在你通过的每个儿子。

如果您使用两个不同的持久性单元,也可以在不使用子类的情况下执行此操作。

每个持久性单元可以指定一组唯一的映射(包括表名)。 一种方法是创build两个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(可能不是你想要的)创build一个单独的EntityManagerFactory,但是如果你想在不同的数据库(使用不同的表名)上使用相同的类,这将是一个方法。