Hibernate用Unique约束列做外键,如何配置?
我有一个需求,需要用一个unique约束的键作为外键,而不是主键作为外键,应该如何配置?
大只需求描述如下:
两张表,一张是门禁卡表(card_info), 另一张刷卡记录表(card_data)
在门禁卡表中有自己的主键(card_id),同时还有一个门禁卡编号(card_code),card_code上有unique约束
刷机记录表中保存的也是“门禁卡编号”,外键关联至 card_info表的card_code字段
我当前配置如下:
- Java code
@Entity@Table(name = "card_info")public class CardInfo{ @GenericGenerator(name = "uuid", strategy = "com.hibernate.my.UUIDGenerator") @GeneratedValue(generator = "uuid") @Column(name = "card_id") @Id private String cardId; @Column(name = "card_user_name") private String cardUserName; @Column(name = "card_code") //这个键是唯一约束键,意思是“卡片编号” private String cardCode;//setter getter省略}
刷卡记录表
- Java code
@Entity@Table(name = "card_data")public class CardData{ @GenericGenerator(name = "uuid", strategy = "com.hibernate.my.UUIDGenerator") @GeneratedValue(generator = "uuid") @Column(name = "card_data_id") @Id private String cardDataId; @Column(name = "create_time") private Date createTime; //刷卡时间 @Column(name = "card_code") //这个键是唯一约束键,意思是“卡片编号” private String cardCode; @ManyToOne(fetch = FetchType.LAZY) @Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE }) @JoinColumn(name = "card_code", insertable = false, updatable = false, unique = true) private CardInfo cardInfo;//setter getter省略
如此配置下,观察生成的sql语句是:
- SQL code
select * from card_data data inner join card_info info on data.card_code=info.card_id
也就是说,Hibernate依然按照 card_data表中的card_code和 card_info表中的主键 card_id进行left join查询!
而我希望的结果是:
- SQL code
select * from card_data data inner join card_info info on data.card_code=info.card_code --这里是两个表的card_code进行匹配
我应该如何做呢?这个问题搞了一晚上了,求帮助!
[解决办法]
需要在@ManyToOne注解中加入此属性:referencedColumnName="u_code";