Spring Roo,Hibernate,一对多关系创建附加表
问题内容:
我是Spring MVC,ROO和Hibernate的新手。
我正在尝试创建两个具有1:M关系的表。
例如,我想要两个实体,Person和Car。一个人可以拥有许多汽车。
我已经使用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;
}
为Person生成的类
@RooJavaBean
@RooToString
@RooEntity
public class Person {
private String Name;
@OneToMany(cascade = CascadeType.ALL)
private Set<Car> ownedCars = new HashSet<Car>();
}
但是,在数据库中,有3个表(两个插入)
台车(如预期)
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)
)
为什么生成最后一张表?上一张表的目的是什么,它不是多对多关系?可以避免吗?难道我做错了什么?
问题答案:
我不确定Roo是如何管理的,但是您需要将双向关系的边与链接mappedBy
:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
private Set<Car> ownedCars = new HashSet<Car>();
否则,它们将被解释为两个不同的单向关系,并且通过联接表实现from Person
到to的关系Car
(这是单向一对多关系的默认行为)。