2011-06-01 26 views
7

Quiero usar el generador de modelo Meta JPA 2 para Hibernate (Versión 1.1.1-Final) (en una aplicación de primavera). Como utilizo una Superclase mapeada que es la base para todas las Entidades, y esta clase está ubicada en un contenedor diferente (para reutilizar) Necesito asignar esta clase explícitamente en XML (solo para la generación del modelo meta porque funciona sin ninguna cosas adicionales a tiempo) --- Que alguien tenga una pista sobre cómo resolver esto en general, pero no es la pregunta.JPA 2 XML Asignación de incrustado para que funcione con el generador de modelo Hibernate Meta

Esta superclase asignada (BusinessEntity) usa una clase incrustada (BusinessId).

@SuppressWarnings("serial") 
@MappedSuperclass 
public abstract class BusinessEntity<T extends Serializable> 
         implements Serializable { 
    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Long id; 

    @Embedded 
    private BusinessId<T> businessId; 
... 
} 


@Embeddable 
public class BusinessId<T> implements Serializable { 
    @Column(nullable = false, unique = true, name = "businessId") 
    private long businessId; 
    ... 
} 

Pero no consigo la asignación de trabajo junto con el generador: Si utilizo este orm.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 
    http://java.sun.com/xml/ns/persistence/orm_2_0.xsd" 
    version="2.0"> 

    <mapped-superclass class="BusinessEntity" 
      access="FIELD">  
     <attributes>    
      <id name="id"> 
       <column nullable="false"/> 
       <generated-value strategy="AUTO"/>    
      </id> 
      <embedded name="businessId"/> 
     </attributes>  
    </mapped-superclass> 

    <embeddable class="BusinessId" 
      access="FIELD"> 
     <attributes> 
      <basic name="businessId"> 
       <column nullable="false" unique="true"/> 
      </basic> 
     </attributes> 
    </embeddable> 
</entity-mappings> 

El Generador crear esta dos archivos:

@StaticMetamodel(BusinessEntity.class) 
public abstract class BusinessEntity_ { 
    public static volatile SingularAttribute<BusinessEntity, Long> id; 
} 

@StaticMetamodel(BusinessId.class) 
public abstract class BusinessId_ { 
    public static volatile SingularAttribute<BusinessId, Long> businessId; 
} 

Puede ver, ¡falta el campo incrustado businessId en BuinessEntity!

Cuando se sustituye la <embedded name="businessId"/> por <basic name="businessId" /> la Generador crear esta clase uncompilable (El Genérico T no puede se han resuelto).

@StaticMetamodel(BusinessEntity.class) 
public abstract class BusinessEntity_ { 

    public static volatile SingularAttribute<BusinessEntity, Long> id; 
    public static volatile 
      SingularAttribute<BusinessEntity, BusinessId<T>> businessId; 
} 

Así que mi pregunta es cómo asignar las cosas correctas? - ¿O hay una mejor manera en general?

Respuesta

2

<basic> no se puede utilizar para tipos complejos. Debe usar <incrustado>. También he experimentado deficiencias en el procesador de anotación cuando se aplica a orm.xml.

he presentado este problema hace un tiempo (18º febrero):

http://opensource.atlassian.com/projects/hibernate/browse/METAGEN-57

que no ha sido estudiado todavía. Parece que no se le presta tanta atención ya que el procesador está trabajando para las anotaciones.

Sugiero que envíe un problema para sus problemas también.

Cuestiones relacionadas