读书人

Hibernate用Unique约束列做外键怎么

发布时间: 2012-08-10 12:19:33 作者: rapoo

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

探讨

引用:

数据库里面 外键 必须是另外一张表的主键啊?


一般都是主键做外键,但是主表中的唯一键也是可以做外键的,你可以将两张表做实验试试

SQL code

create table t1(
u_id number(10) primary key,
uname varchar(32),
u_code varch……

读书人网 >J2EE开发

热点推荐