2011-03-02 51 views
15

我是新来的春天mvc,roo和hibernate。Spring Roo,Hibernate,一对多关系创建附加表

我正试图用1:M关系创建两个表。

例如, 我想要两个实体Person和Car。一个人可以有很多车。

使用袋鼠

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 

汽车生成的类我创建实体:

@RooJavaBean 
@RooToString 
@RooEntity 
public class Car { 

    private String Name; 

    @ManyToOne 
    private Person owner; 
} 

的人生成类

@RooJavaBean 
@RooToString 
@RooEntity 
public class Person { 

    private String Name; 

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

然而,在数据库中,有3个桌子(全二)

表CAR(预期)

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

表人士(预期)

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

也PERSON_OWNED_CARS(预计不,这不是多对多的关系)

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

为什么生成最后一个表格?最后一张桌子的目的是什么?这不是多对多的关系?可以避免吗?难道我做错了什么?

回答

20

我不知道袋鼠如何管理这一点,但你需要mappedBy链接双向关系的两面性:

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

否则,它们将被解释为两个不同的单向关系,并从PersonCar关系通过连接表实现(这是单向一对多关系的默认行为)。

+1

优秀的答案!谢谢! – Emir 2011-03-02 11:03:25

+5

要从Roo本身执行,可以使用'--mappedBy所有者'选项。 感谢您的问题和答案! – xverges 2011-11-30 11:54:49

+0

非常有用的答案,我真的迷失在这里关于表生成行为。 – 2012-02-23 11:01:01