Как создать таблицу соединений с аннотациями JPA? - PullRequest
28 голосов
/ 02 ноября 2011

Мне нужно создать таблицу соединений в моей базе данных, используя аннотации JPA, поэтому результат будет таким:

enter image description here

Пока я только что реализовал 2 объекта:

@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {

    private static final long serialVersionUID = -1244856316278032177L;
    @Id 
    @Column(nullable = false)
    private String userid;  

    @Column(nullable = false)
    private String password;

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {

    private static final long serialVersionUID = -7274308564659753174L;
    @Id
    @Column(nullable = false)
    private String groupid;

    public String getGroupid() {
        return groupid;
    }
    public void setGroupid(String groupid) {
        this.groupid = groupid;
    }
}

Должен ли я создать другую сущность с именем USER_GROUP или я могу просто добавить некоторые аннотации, чтобы таблица соединений создавалась автоматически при запуске создания таблиц из сущностей (ORM)?

Как мне аннотировать мои объекты, чтобы достичь того же, что и на картинке?

Ответы [ 4 ]

36 голосов
/ 02 ноября 2011

Вы определенно не должны создавать сущность User_Group, так как это больше базовое представление базы данных, чем объектно-ориентированное.

Вы можете достичь таблицы объединения, определив что-то вроде:

@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {
//...

@ManyToOne
@JoinTable(name="USER_GROUP")
Group group;

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {
//...

@OneToMany(mappedBy="group")
Set<User> users;

Редактировать: Если вы хотите явно задать имена столбцов, вы можете использовать элементы @JoinColumn, как показано ниже:

@ManyToOne
@JoinTable(name="USER_GROUP",
    joinColumns = @JoinColumn(name = "userid", 
                              referencedColumnName = "userid"), 
    inverseJoinColumns = @JoinColumn(name = "groupid", 
                              referencedColumnName = "groupid"))
Group group;
6 голосов
/ 02 ноября 2011

Чтобы иметь те же аннотации, что и на вашей диаграмме, вы можете сделать это в вашем User классе:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_GROUP", 
           joinColumns = { @JoinColumn(name = "userid") }, 
           inverseJoinColumns = { @JoinColumn(name = "groupid") })
private List<Group> grups;

в классе вашей группы

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_GROUP", 
           joinColumns = { @JoinColumn(name = "groupid") }, 
           inverseJoinColumns = { @JoinColumn(name = "userid") })
private List<User> users;
6 голосов
/ 02 ноября 2011

Я бы реализовал это так:

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {
  @OneToMany
  @JoinTable(name = "USER_GROUP",
            joinColumns = @JoinColumn(name = "groupid"),
            inverseJoinColumns = @JoinColumn(name = "userid"))
  private List<User> users;
}

Решение, предложенное @PedroKowalski, тоже должно работать, но тогда вам нужно будет сохранить ссылку на Группу сущность в вашей Пользователь сущность, которая не всегда возможна.

0 голосов
/ 18 августа 2016

Мне интересно, какой смысл создавать таким образом таблицу соединений, учитывая, что мы не можем получить прямой доступ к запросам?JPA не позволяет делать запросы непосредственно к таблице соединений, поэтому, если пользователь хочет выполнить операцию на USER_GROUP , он должен создать обычный запрос на соединение между users и группы ;из-за этого таблица соединения USER_GROUP бесполезна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...