Spring Roo,Hibernate,一对多关系创建了额外的表

时间:2011-03-02 09:49:23

标签: hibernate spring-mvc spring-roo

我刚开始玩mvc,roo和hibernate。

我正在尝试使用1:M关系创建两个表。

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

我使用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 

为汽车生成的课程:

@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)
   )

表PERSON(正如所料)

  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)
   )

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

1 个答案:

答案 0 :(得分:20)

我不确定Roo是如何管理的,但您需要将双向关系的各个方面与mappedBy相关联:

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

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