2011-03-02 10 views
15

Soy nuevo en spring mvc, roo e hibernate.Spring Roo, Hibernate, relación de uno a muchos crea la tabla adicional

Estoy tratando de crear dos tablas con relación 1: M. Por ejemplo, Quiero dos entidades, Persona y automóvil Una persona puede tener muchos autos.

entidades que he creado utilizando Roo

entity --class ~.domain.Person 
field string Name 
entity --class ~.domain.Car 
field string Name 
field reference --fieldName owner --type ~.domain.Person 
field set --fieldName ownedCars --type ~.domain.Car --class ~.domain.Person --cardinality ONE_TO_MANY 

clase generada para coche:

@RooJavaBean 
@RooToString 
@RooEntity 
public class Car { 

    private String Name; 

    @ManyToOne 
    private Person owner; 
} 

clase generada por persona

@RooJavaBean 
@RooToString 
@RooEntity 
public class Person { 

    private String Name; 

    @OneToMany(cascade = CascadeType.ALL) 
    private Set<Car> ownedCars = new HashSet<Car>(); 
} 

Sin embargo, en la base de datos, hay 3 tablas (en lugar de dos)

Tabla CAR (como se esperaba)

CREATE TABLE "TEST"."CAR" 
    ( 
    "ID" NUMBER(19,0), 
    "NAME" VARCHAR2(255 BYTE), 
    "VERSION" NUMBER(10,0), 
    "OWNER" NUMBER(19,0) 
    ) 

PERSONA tabla (como se esperaba)

CREATE TABLE "TEST"."PERSON" 
    (
"ID" NUMBER(19,0), 
    "NAME" VARCHAR2(255 BYTE), 
    "VERSION" NUMBER(10,0) 
    ) 

y también PERSON_OWNED_CARS (que no se espera, no es de muchos a muchos)

CREATE TABLE "TEST"."PERSON_OWNED_CARS" 
    (
"PERSON" NUMBER(19,0), 
    "OWNED_CARS" NUMBER(19,0) 
    ) 

¿Por qué se genera la última tabla? ¿Cuál es el propósito de la última tabla, no es una relación de muchos a muchos? ¿Se puede evitar? ¿Estoy haciendo algo mal?

Respuesta

20

No estoy seguro de cómo Roo logra esto, pero es necesario enlazar lados de las relaciones bidireccionales con mappedBy:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner") 
private Set<Car> ownedCars = new HashSet<Car>(); 

De lo contrario, se interpretan como dos relaciones unidireccionales diferentes, y la relación de Person a Car es implementado a través de la tabla de unión (es un comportamiento predeterminado para relaciones unidireccionales de uno a muchos).

+1

¡Excelente respuesta! ¡Gracias! – Emir

+5

Para hacerlo desde Roo se puede usar la opción '--mappedBy owner'. Gracias por la pregunta y la respuesta! – xverges

+0

Respuesta muy útil, realmente estaba perdido aquí sobre el comportamiento de generación de tablas. –

Cuestiones relacionadas