【发布时间】:2017-10-14 02:55:45
【问题描述】:
如何实现复合键,让我们做一个非常简单的例子,用户参加活动,三个数据库表:User、Event、Users_Attending_Events 最后一个表有三个列:userID、eventID;它们与其他两个表的各自 ID 和成功连接,这决定了用户是否向事件炫耀。
我希望Attending 是一个单独的类,不要直接加入User 和Event,因为Attending 包含“成功”信息,必须单独管理。
我的实现
用户对象:
@Entity
@Table(name = "[users]")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer userID;
@JsonIgnore
@OneToMany(mappedBy = "attend", targetEntity = Attending.class, fetch = FetchType.LAZY)
private Set<Attending> attendEvents = new HashSet<Attending>();
...
// setters, getters, constructors, equal and hash ...
}
事件:
@Entity
@Table(name = "events")
public class Event implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer eventID;
@JsonIgnore
@OneToMany(mappedBy = "attend", targetEntity = Attending.class, fetch = FetchType.LAZY)
private Set<Attending> participants = new HashSet<Attending>();
...
// setters, getters, constructors, equal and hash ...
}
上课:
@Entity
@Table(name = "users_attending_events")
public class Attending implements Serializable {
@EmbeddedId
protected AttendingID attend;
private Integer success;
...
// setters, getters, constructors, equal and hash ...
}
AttendingID 类,用于复合键:
@Embeddable
public class AttendingID implements Serializable {
@ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
@JoinColumn(name = "users_userID", referencedColumnName = "userID")
private Integer user;
@ManyToOne(targetEntity = Event.class, fetch = FetchType.LAZY)
@JoinColumn(name = "events_eventID", referencedColumnName = "eventID")
private Integer event;
...
// setters, getters, constructors, equal and hash ...
}
运行时出现异常:
org.hibernate.MappingException: Foreign key (FKlerh9fv4q1rjiusg0ful3m15j:users_attending_events [events_eventID,users_userID])) must have same number of columns as the referenced primary key (users [userID])
我错过了什么?
【问题讨论】:
标签: java spring hibernate jpa hibernate-mapping