JPA,如何使用相同的类(实体)映射不同的表?
我有两个表: Ta
和Tb
。 他们有完全相同的表结构,但不同的表名称。
我尝试创build一个实体类来映射表结构。 我的一些常用应用程序模块将使用这个实体类根据参数dynamic查询和更新Ta
或Tb
。 可以在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,但是如果你想在不同的数据库(使用不同的表名)上使用相同的类,这将是一个方法。