Как создать таблицу объединений с аннотациями JPA?
Мне нужно создать таблицу соединений в моей базе данных с помощью аннотаций 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)?
Как я должен аннотировать мои сущности для достижения того же, что и на изображении?
Ответы
Ответ 1
Вы определенно не должны создавать объект 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;
Ответ 2
Я бы реализовал его следующим образом:
@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, тоже должно работать, но тогда вам нужно будет сохранить ссылку на Группу в Пользователь, что не всегда возможно.
Ответ 3
Чтобы иметь те же аннотации, что и на диаграмме, вы можете сделать это в своем классе 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;
Ответ 4
Мне интересно, какой смысл создавать таблицу Join таким образом, учитывая, что мы не можем напрямую обращаться к запросам?
JPA не позволяет делать запросы непосредственно в таблице соединений, поэтому, если пользователь хочет выполнить операцию с USER_GROUP, ему необходимо создать обычный запрос соединения между пользователями и группы; из-за этого таблица соединения USER_GROUP бесполезна.