@IdClass Не Генерирует Внешний Ключ

#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;
 

Полный рабочий пример вы можете найти здесь