Hibernate @OneToMany без отдельной таблицы соединений - PullRequest
18 голосов
/ 21 августа 2009

Рассмотрим следующую схему базы данных:

create table UserGroup ( id int not null auto_increment, name varchar(200),
    primary key(id));
create table User ( id int not null auto_increment, name varchar(200),
    groupId int not null, primary key(id));

User.groupId = UserGroup.id, поэтому пользователь может быть членом только одной группы, но группа пользователей может существовать из многих пользователей. Пока все хорошо, давайте сделаем сущности в Hibernate. Вот User:

@Entity
@Table(name = "User")
public class User {

    @Id
    @Column(name="id", nullable = false)
    private Integer id;

    @Column(name="name", length = 200, nullable = true)
    private String name;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "groupId", nullable = false, insertable=false, updatable=false)
    @ForeignKey(name="FK_GroupId")
    private UserGroup userGroup;

    /* Getters, Setters, toString, equals & hashCode */
}

Вот UserGroup:

@Entity
@Table(name = "UserGroup")
public class UserGroup {

    @Id
    @Column(name="id", nullable = false)
    private Integer id;

    @Column(name="name", length = 200, nullable = true)
    private String name;

    @OneToMany(fetch=FetchType.EAGER)
    private List<User> users;

    /* Getters, Setters, toString, equals & hashCode */
}

Теперь я получу ошибку "Table mydb.usergroup_user' doesn't exist", потому что она ожидает соединения таблицы. Моя структура данных «заштрихована» из-за взаимодействия с другими приложениями, которые заменит это приложение, поэтому я не буду создавать таблицы соединений. Кроме того, это не должно быть необходимо. Как я могу создать List<User> users, который просто является списком пользователей, где User.groupId == UserGroup.Id?

1 Ответ

20 голосов
/ 21 августа 2009

Я думаю, вам нужно mappedBy="UserGroup" в аннотации @OneToMany.

...