Tengo el siguiente "raíz" entidad (partes hibernar-específicos comentado out):separan entidades JPA de Hibernate específica ajustes
@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
}
esto es parte de un contexto de persistencia desplegado en JBoss AS 6 (hibernar 3,6) usando PostgreSQL 9 para la base de datos (usando el último controlador JDBC4). PostgreSQL tiene su propio tipo de columna uuid, que requiere algunas asignaciones específicas de hibernación para usar correctamente (comentadas en el código anterior); de lo contrario, hibernate intentará mapear el campo UUID a BINARY, entonces el dialecto PostgreSQL no admite BINARY (aparentemente porque postgre tiene 2 maneras de almacenar desarrolladores binarios y de hibernación que no les gusta) y todo explota.
al descomentar las líneas de arriba produce código de trabajo, pero me obliga a tener una dependencia de hibernación en tiempo de compilación, lo que prefiero evitar.
intentar agregar un archivo hbm.xml en la mezcla y referencia a ella desde el persistence.xml no fusionar los datos del archivo y las anotaciones, sino que simplemente hace caso omiso de las anotaciones:
<?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>
puedo "pelusa "este archivo mediante la adición de los extra de 2 propiedades, pero incluso si lo hago (momento en el cual los trabajos de clase Node), la adición de cualesquiera entidades adicionales, como:
@Entity
public class Host extends Node {
//fields, getters, fluff
}
me sale la siguiente excepción:
org.hibernate.DuplicateMappingException: Duplicate class/entity mapping Node
ya que hibernate "encuentra" Nodo dos veces. ¿Hay alguna manera elegante alrededor de esto? idealmente, Node es la única clase para la que necesitaré propiedades específicas de hibernación, y será la raíz de una gran jerarquía de clases. Me gustaría evitar las dependencias de tiempo de compilación en hibernación o mapear todo completamente en hbm.xml. por el bien integridad, aquí está el archivo persistence.xml im usando:
<?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>
me marcó "Java Persistence con APP" (un 2,0 APP en paquete), pero no dice nada acerca de UUID, así que supongo que aún no son compatibles con JPA. – esaj
son compatibles al menos en el sentido de que todo lo que sea serializable es compatible (se traduciría en datos binarios). pero con PostgreSQL + Hibernate no obtendrá ni siquiera eso ... – radai