日期:2014-05-19  浏览次数:20767 次

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……