我有两个表:Ta
和 Tb
。它们的表结构完全相同,但是表名不同。
我想创建一个实体类来映射这些表的结构。我的一些通用应用程序模块将使用这个实体类根据参数动态查询和更新Ta
或Tb
中的数据。在JPA中可以实现吗?我该如何编写程序,在运行时将实体类动态映射到不同的表?
不确定您是否可以完全按照您的意愿进行操作,但是您可以使用继承来产生相同的结果。
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 {
...
}
<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(可能不是您想要的),但如果您想在不同的数据库上使用相同的类(具有不同的表名),这将是一种方法。