《Hibernate学习笔记七》一对一联合主键的关联

来源:互联网 发布:gta5捏脸数据女日本 编辑:程序博客网 时间:2024/06/05 11:49

《Hibernate学习笔记七》一对一联合主键的关联

前面我们讲解了一对一外键关联和一对一主键的关联,这篇博文介绍下联合主键的关联关系。

先回顾下联合主键,可以参考以前写的这篇博文:http://blog.csdn.net/u010412719/article/details/51275744

联合主键的关联

假设有Husband实体类和Wife实体类,Husband类中的主键为id,而 Wife实体类中的主键由id 和name联合主导。

先看Wife实体类

联合主键的映射这里采用第三种方法:@IdClass类做。其中,主键类WifePK要继承Serialable接口,以及要重写equals、hashCode方法。

代码如下:

@Entity    @IdClass(WifePK.class)    public class Wife {    private int id;    private String name;    private int age;    @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 int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }       }    package com.hibernate.model;    import java.io.Serializable;    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 this.name.hashCode();    }    @Override    public boolean equals(Object obj) {         if (obj instanceof WifePK) {             WifePK pk = (WifePK) obj;             if(this.id==pk.getId()&&this.name.equals(pk.getName())){                 return true;             }                  }        return false;    }    }

Husband类

在单个主键中,我们一对一采用的注解为:@JoinColumn(name=”wifeId”)

现在wife中有两个主键,应该怎么办呢??

方法如下:

@OneToOne    @JoinColumns(            {                @JoinColumn(name="wifeId",referencedColumnName="id"),                @JoinColumn(name="wifeName",referencedColumnName="name")            }       )

Husband类详细代码如下:

@Entity    public class Husband {    private int id;    private String name;    private Wife wife;    @Id    @GeneratedValue    public int getId() {        return id;    }    @OneToOne    @JoinColumns(            {                @JoinColumn(name="wifeId",referencedColumnName="id"),                @JoinColumn(name="wifeName",referencedColumnName="name")            }       )    public Wife getWife() {        return wife;    }    public void setWife(Wife wife) {        this.wife = wife;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    }

测试类代码如下:

测试代码中主要借用了SchemaExport来将SQL语句输出到数据库中。

public class Test {    @Test    public void testSchema(){        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();        Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata();        SchemaExport schemaExport = new SchemaExport();        schemaExport.create(EnumSet.of(TargetType.DATABASE), metadata);    }    }

执行结果如下:

从结果可以看出,这样就建立了一个一对一的联合主键之间的关联。

小结

上面主要介绍了一对一联合主键的关联关系的Annotation的实现,而关于.xml文件的实现由于相当繁琐,这里不再进行介绍。

0 0
原创粉丝点击