Spring Roo, Hibernate, отношение один ко многим создает дополнительную таблицу - PullRequest
15 голосов
/ 02 марта 2011

Я новичок в весенних 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)
   )

Таблица ЧЕЛОВЕК (как и ожидалось)

  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 Ответ

20 голосов
/ 02 марта 2011

Я не уверен, как Roo управляет этим, но вам нужно связать стороны двунаправленных отношений с mappedBy:

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

В противном случае они интерпретируются как два разных однонаправленных отношения и отношения из *От 1005 * до Car реализуется через таблицу соединений (это поведение по умолчанию для однонаправленных отношений «один ко многим»).

...