#java #hibernate
Вопрос:
У меня есть следующие сущности:
public class UserGroupId implements Serializable {
@Column(name = "user_id")
private String userId;
@Column(name = "group_id")
private Integer group;
public String getUserId() {
return userId;
}
public void setUserId(String productId) {
this.userId = productId;
}
public Integer getGroupId() {
return group;
}
public void setGroup(Integer group) {
this.group = group;
}
@Entity
@Table(name = "user_interest")
@IdClass(UserGroupId.class)
public class UserInterest extends BaseEntity {
@Id
@Column(name = "user_id")
private String userId;
@Id
@ManyToOne
@JoinColumn(name = "group_id")
private Group group;
public String getUserId() {
return this.userId;
}
public Group getGroup() {
return group;
}
public void setUserId(String userId) {
this.userId = userId;
}
public void setGroup(Group product) {
this.group = product;
}
}
Hibernate не создает связи внешнего ключа между интересами пользователей и группой. Как я могу это решить ?
БОНУС: Я хочу переименовать group
в groupId
in UserGroupId. Как я могу сопоставить ассоциацию, сохраняя при этом имя group
в интересе пользователя ?
Ответ №1:
Вам нужно удалить @Column
аннотации из UserGroupId
, и это будет работать. Взгляните здесь на рабочий пример. Кроме того, посмотрите на пример 134 в документах hibernate.
К сожалению, вы не можете переименовать group
переменную в groupId
in UserGroupId
. В этом случае у вас будет исключение:
org.hibernate.AnnotationException: Property of @IdClass not found in entity io.bdshadow.UserInterest: groupId
Хорошая альтернатива, где вы можете это сделать, — это @EmbeddedId
в сочетании с @MapsId
.
@Entity
@Table(name = "user_interest")
public class UserInterest {
@EmbeddedId
private UserGroupId userGroupId;
@ManyToOne(cascade = CascadeType.ALL)
@MapsId("groupId")
private Group group;
@Embeddable
public class UserGroupId implements Serializable {
@Column(name = "user_id")
private String userId;
private Integer groupId;
Полный рабочий пример вы можете найти здесь