rad*_*dai 11 java persistence hibernate jpa jpa-2.0
我有以下"root"实体(特定于hibernate的部分注释掉):
@Entity
//@GenericGenerator(name="system-uuid",strategy="org.hibernate.id.UUIDGenerator")
public class Node extends PersistentEntity {
private UUID id;
private String name;
private String displayName;
@Id
@GeneratedValue
//@GeneratedValue(generator="system-uuid") //instead of above line
//@Type(type = "pg-uuid")
public UUID getId() { return id; }
public String getName() { return name; }
public String getDisplayName() { return displayName; }
//stuff omitted
}
Run Code Online (Sandbox Code Playgroud)
这是使用PostgreSQL 9为数据库(使用最新的JDBC4驱动程序)部署在JBoss AS 6(hibernate 3.6)上的持久化上下文的一部分.PostgreSQL有自己的uuid列类型,需要一些特定于hibernate的映射才能正确使用(在上面的代码中注释掉) - 否则hibernate将尝试将UUID字段映射到BINARY,然后PostgreSQL方言不支持BINARY(显然是因为postgre有两种方式存储二进制和hibernate devs不喜欢它)并且整个事情爆炸了.
取消注释上面的行产生工作代码,但它迫使我对hibernate有一个编译时依赖 - 我宁愿避免.
尝试将hbm.xml文件添加到混合中并从persistence.xml引用它不会合并文件和注释中的数据,而只是忽略注释:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="package">
<class name="Node">
<id name="id" type="pg-uuid">
<generator class="org.hibernate.id.UUIDGenerator"/>
</id>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
我可以通过添加额外的2个属性来"填充"此文件,但即使我这样做(此时Node类正常工作),添加任何额外的实体,如:
@Entity
public class Host extends Node {
//fields, getters, fluff
}Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
org.hibernate.DuplicateMappingException: Duplicate class/entity mapping NodeRun Code Online (Sandbox Code Playgroud)
因为hibernate"发现"节点两次.这周围有什么优雅的方式吗?理想情况下,Node是我需要特定于hibernate的属性的唯一类,它将成为大型类层次结构的根.我想避免在hibernate上编译时依赖,或者在hbm.xml中完全映射所有内容.为了完整起见,这里是使用的persistence.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="myPU" transaction-type="JTA">
<jta-data-source>java:/my-postgresql-DS</jta-data-source>
<mapping-file>META-INF/hbm.xml</mapping-file>
<!-- shouldnt need to list classes here since this is deployed -->
<!-- in the same jar as the classes and scanning should work -->
<validation-mode>AUTO</validation-mode>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2345 次 |
| 最近记录: |