(4)OneToOne联合单向外键关联: @JoinColumns

Wife中是联合主键
在利用@IdClass(WifePK.class)方式时,主键类(WifePK)中的属性和Wife中的属性要相同

@Entity
@IdClass(WifePK.class)
public class Wife {


    private int id;
    private String name;


    @Id
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }


    @Id
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }   
}

主键类


public class WifePK implements Serializable{

    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {

        return id*10+name.hashCode();
    }
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof WifePK){
            WifePK pk=(WifePK) obj;
            if(pk.id==this.id&&pk.name==this.name)
            {
                return false;
            }
        }
        return true;
    }
}

husband类

@Entity
public class Husband {

    private int id;
    private String name;
    private int age;
    private Wife wife;

    @Id
    @GeneratedValue

    /*
     * 使用@Id注解可以将属性标识为id,一般情况让hibernate自动生成策略来生成主键
     * 这种写法:会自动根据数据库类型,生成不同的自增长。在mysql中是auto_increment
     * 在oracle中是sequence
     * 所以主键要有两个注解
     */
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @OneToOne//Husband 与Wife 是一一对应关系
    @JoinColumns(
    {
            @JoinColumn(name="wifeid",referencedColumnName ="id") ,
            @JoinColumn(name="wifeName",referencedColumnName ="name") 
    }
)
    public Wife getWife() {
        return wife;
    }
    public void setWife(Wife wife) {
        this.wife = wife;
    }

}

@JoinColumns:即 @JoinColumn数组,定义了关联的组合外键,显式指明referencedColumnNames是种好的实践方式。若不指定,默认生成策略是wi_id wi_name ,@JoinColumn设置name,只是重命名而已

posted @ 2017-11-12 13:18  测试开发分享站  阅读(325)  评论(0编辑  收藏  举报