2011-03-02 52 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