2011-03-09 17 views
5


Estoy usando herramientas de Hibernate 3.40 en Eclipse (Helios). Estoy intentando generar POJOs desde mi base de datos (MSSQL 2008) con estilo EJB3 (es decir, anotaciones JPA2.0).
Digamos que tengo dos tablas A y B donde hay una clave externa de A a B.
Esto genera, de forma predeterminada, un POJO para A que tiene B como miembro (su "principal") y un POJO para B que tiene un Set<A> como miembro (sus "hijos").
Lo que me gustaría es saber cómo puedo controlar el rev-eng para que solo se cree un lado de la asociación (tengo diferentes casos de uso, así que básicamente las tres opciones son importantes para mí).
no quiero utilizar hbm.xml archivos como los que estoy trabajando con anotaciones y JPA2.0 pero puedo especificar algunos metadatos en el proceso de ingeniería inversa para hibernar a través hibernae.reveng.xmlProblema con la ingeniería inversa una asociación unidireccional muchos a uno con herramientas de hibernación

He intentado configurar el atributo foreign-key y definir allí el exclude=true pero eso solo me proporcionó la mitad de una respuesta para un escenario. Eso generó un POJO A con un miembro int bPK que es tolerable y comprensible pero el POJO generado de B ahora no se compila ya que la anotación one-to-many tiene un atributo no válido; El mappedby="unresolved" debido al hecho de que A ya no tiene una propiedad que hibernate reveng pueda mapear.

Por lo tanto, actualmente no puedo crear asociaciones unidireccionales y agradecería cualquier ayuda.

Respuesta

3

Crear una clase para reveng. strategy en Hibernate Code Generation Configuration

Ejemplo:

public class MyReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy { 

    public MyReverseEngineeringStrategy(ReverseEngineeringStrategy delegate) { 
     super(delegate); 
    } 

    @Override 
    public void setSettings(ReverseEngineeringSettings settings) { 
     super.setSettings(settings); 
    } 

    @Override 
    public boolean excludeForeignKeyAsCollection(String keyname, 
    TableIdentifier fromTable, java.util.List fromColumns, 
    TableIdentifier referencedTable, java.util.List referencedColumns) { 

    // TODO : Your work here 
    if (keyname.equals("___") && 
     fromTable.getName().equals("___") && 
     fromColumns.contains("___") && 
     referencedTable.getName().equals("___") && 
     referencedColumns.contains("___")) { 

     return true; 
    } 

    return false; 
    } 
} 

JavaDoc para el método excludeForeignKeyAsCollection

Should this foreignkey be excluded as a oneToMany 

y también tiene otra llamada método excludeForeignKeyAsManytoOne

Should this foreignkey be excluded as a many-to-one 
+1

muchas gracias. Ojalá hubiera una mejor manera de hacerlo que codificar estos requisitos en esa clase "oscura", pero al menos es una solución funcional. – Ittai

+0

Tengo el mismo problema, pero su respuesta es específica para el "___", no es una respuesta general. Gracias de cualquier manera – Kummo

0

Actualmente (probado con Hibernate Tools 5.2), generando trabajos unidireccionales de muchos a uno.

En la documentación (https://docs.jboss.org/tools/4.0.0.Final/en/hibernatetools/html_single/index.html#hibernaterevengxmlfile), se puede ver que se puede excluir algunas lado de la relación:

Por ejemplo (propiedades de cambio de nombre)

<!-- control many-to-one and set names for a specific named foreign key constraint --> 
<foreign-key constraint-name="ORDER_CUST"> 
    <many-to-one property="customer"/> 
    <set property="orders"/> 
</foreign-key> 

o (excluyendo propiedades)

<!-- can also control a pure (shared pk) one-to-one --> 
    <foreign-key constraint-name="ADDRESS_PERSON"> 
    <one-to-one exclude="false"/> 
    <inverse-one-to-one exclude="true"/> 
    </foreign-key> 

Para tener solo un lado de la relación con @ManyToOne solamente, puede hacer lo siguiente:

<table name="city" schema="public"> 
    <primary-key property="id"> 
     <key-column name="id" type="integer"/> 
    </primary-key> 
</table> 

<table name="country" schema="public"> 
    <foreign-key constraint-name="country_capital_fkey" foreign-schema="public"> 
     <many-to-one property="capital" exclude="false"/> 
     <set exclude="true" /> 
    </foreign-key> 
</table> 

También puede obtener una instancia de mi base de datos de muestra con acoplable aquí: ghusta tirón

ventana acoplable/postgres-mundo-db: 2.1

Cuestiones relacionadas