Hibernate @JoinColumns、@PrimaryKeyJoinColumns和@PrimaryKeyJoinColumn之间的差异
我正在使用Hibernate持久化两个表,User和DistrictUser。User表有一个复合PK UserPK 为什么@PrimaryKeyJoinColumn和@PrimaryKeyJoinColumns的结果表DistrictUser相同 为什么DistrictUser中的列名在使用@PrimaryKeyJoinColumn或@PrimaryKeyJoinColumns时前面加上了“user_389;”,而我在注释的“name”属性中明确提到了该名称Hibernate @JoinColumns、@PrimaryKeyJoinColumns和@PrimaryKeyJoinColumn之间的差异,hibernate,Hibernate,我正在使用Hibernate持久化两个表,User和DistrictUser。User表有一个复合PK UserPK 为什么@PrimaryKeyJoinColumn和@PrimaryKeyJoinColumns的结果表DistrictUser相同 为什么DistrictUser中的列名在使用@PrimaryKeyJoinColumn或@PrimaryKeyJoinColumns时前面加上了“user_389;”,而我在注释的“name”属性中明确提到了该名称 @Entity @Table(na
@Entity
@Table(name = "DistrictUser")
public class DistrictUser {
@Id
@Column(name = "ID_KEY")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumns( { @JoinColumn(name = "USERS_KEY", referencedColumnName="USERS_KEY"),
@JoinColumn(name = "BEGIN_DATE", referencedColumnName="START_DATE"),
@JoinColumn(name = "END_DATE", referencedColumnName="END_DATE") })
private User user;
// @PrimaryKeyJoinColumns({
// @PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE"),
// @PrimaryKeyJoinColumn(name = "END_DATE", referencedColumnName = "END_DATE"),
// @PrimaryKeyJoinColumn(name = "USERS_KEY", referencedColumnName = "USERS_KEY")})
// @ManyToOne()
// private User user;
//@PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE")
// @ManyToOne()
// private User user;
//getters and setters
}
@Entity
@Table(name = "USERS")
@IdClass(UserPK.class)
public class User
{
@Id
@Column(name = "USERS_KEY")
private Long userKey;
@Id
@Column(name = "START_DATE")
@Temporal(javax.persistence.TemporalType.DATE)
private Date startDate;
@Id
@Column(name = "END_DATE")
@Temporal(javax.persistence.TemporalType.DATE)
private Date endDate;
//getters and setters
}
public class UserPK implements Serializable {
private static final long serialVersionUID = -7720874756224520523L;
private Long userKey;
private Date startDate;
private Date endDate;
//getters and setters
}
保存表的代码
User user = new User();
user.setStartDate(new Date());
user.setEndDate(new Date());
user.setUserKey(1l);
DistrictUser du = new DistrictUser();
du.setId(10l);
du.setUser(user);
session.save(user);
session.save(du);
session.flush();
session.getTransaction().commit();
session.close();
使用JoinColumns时,DistrictUser表为
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumns( { @JoinColumn(name = "USERS_KEY", referencedColumnName="USERS_KEY"),
@JoinColumn(name = "BEGIN_DATE", referencedColumnName="START_DATE"),
@JoinColumn(name = "END_DATE", referencedColumnName="END_DATE") })
private User user;
通过取消对相对代码DistrictUser的注释来使用@PrimaryKeyJoinColumn时
@PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE")
@ManyToOne()
private User user;
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE"),
@PrimaryKeyJoinColumn(name = "END_DATE", referencedColumnName = "END_DATE"),
@PrimaryKeyJoinColumn(name = "USERS_KEY", referencedColumnName = "USERS_KEY")})
@ManyToOne()
private User user;
当@PrimaryKeyJoinColumns通过在DistrictUser中取消注释相对代码来使用时
@PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE")
@ManyToOne()
private User user;
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name = "START_DATE", referencedColumnName = "START_DATE"),
@PrimaryKeyJoinColumn(name = "END_DATE", referencedColumnName = "END_DATE"),
@PrimaryKeyJoinColumn(name = "USERS_KEY", referencedColumnName = "USERS_KEY")})
@ManyToOne()
private User user;
有人能指出这三种方法之间的区别吗