У меня есть следующая «корневая» сущность (закомментированные специфичные для 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
}
это часть постоянного контекста, развернутого в JBoss AS 6 (hibernate 3.6) с использованием PostgreSQL 9 для базы данных (с использованием последней версии драйвера JDBC4). PostgreSQL имеет свой собственный тип столбца uuid, который требует правильного использования некоторых специфичных для hibernate отображений (закомментировано в приведенном выше коде) - в противном случае hibernate попытается отобразить поле UUID в BINARY, тогда диалект PostgreSQL не поддерживает BINARY (очевидно, потому что У postgre есть 2 способа хранения бинарных и спящих разработчиков, что не нравится), и все это взрывается.
раскомментирование строк выше приводит к созданию рабочего кода, но это вынуждает меня зависеть от времени компиляции от 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>
Я могу «взбить» этот файл, добавив дополнительные 2 свойства, но даже если я сделаю это (в этот момент класс Node работает), добавив любые дополнительные сущности, например:
@Entity
public class Host extends Node {
//fields, getters, fluff
}
я получаю следующее исключение:
org.hibernate.DuplicateMappingException: Duplicate class/entity mapping Node
, так как hibernate "находит" узел дважды. есть ли какой-нибудь элегантный способ обойти это? в идеале Node - единственный класс, для которого мне понадобятся специфичные для 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>