hibernate联合主键映射

联合主键用的不是很多,用的时候查到就是。

Wife里id和name联合做主键,需要新建一个主键类,WifePK,必须实现Serializable接口,重写hashcode、equals。

在Husband类里用Wife的id和name做外键关联。

Wife类:

package com.oracle.hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.IdClass;

@Entity
@IdClass(WifePK.class)//指明你外键用的是哪个class
public class Wife {

    private int id;
    private String name;

    private int age;
    //指明id是一部分id
    @Id
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    //name是一部分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;
    }

}

Husband类:

package com.oracle.hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.OneToOne;

@Entity
public class Husband {

    private int id;
    private String name;
    private Wife  wife;    //wife的引用

    @Id    //主键id
    @GeneratedValue    //自动生成
    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;
    }

    @OneToOne    //一对一映射
    /**
     * 外键是两个字段,改变外键名字用joinColumns,值是joinColumn的数组
     * 指定id名字和参考的字段(因为是两个字段,不指定它不知道去找哪个)
     */
    @JoinColumns(
            {
                @JoinColumn(name="wifeId",referencedColumnName="id"),
                @JoinColumn(name="wifeName",referencedColumnName="name")
            }
    )
    public Wife getWife() {
        return wife;
    }
    public void setWife(Wife wife) {
        this.wife = wife;
    }
}

WifePK联合主键类:

package com.oracle.hibernate;

import java.io.Serializable;

/**
 * 联合主键类,不是实体,必须实现Serializable接口, 序列化,可以把这个对象写到硬盘上、读出来,或者在网络上传输。
 * 应该重写hashcode,equals,在内存里保证唯一性
 */
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();
    }

    // 重写equals,逻辑不能乱写
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof WifePK) {
            WifePK pk = (WifePK) obj;
            if (pk.id == this.getId() && pk.name.equals(this.getName()))
                return true;
        }
        return false;
    }

}

生成的表:

hibernate生成表的语句:

create table Husband (
id integer not null auto_increment,
name varchar(255),
wifeId integer,
wifeName varchar(255),
primary key (id)
)
07:14:29,202 DEBUG SchemaExport:377 -
create table Wife (
id integer not null,
name varchar(255) not null,
age integer not null,
primary key (id, name)
)
07:14:29,474 DEBUG SchemaExport:377 -
alter table Husband
add index FKAEEA401B2953CE18 (wifeId, wifeName),
add constraint FKAEEA401B2953CE18
foreign key (wifeId, wifeName)
references Wife (id, name)

时间: 2024-10-21 07:56:29

hibernate联合主键映射的相关文章

Hibernate 查询排序与联合主键映射

1.查询排序 (1)数据库排序(推荐) <map order-by="name ase" > <!--name的升序,降序desc--> session.createQuery(" ").uniqueResult() //返回唯一的对象,前台对象只有一个 <set order-by="name asc"> (2)内存排序 <set sort="natural" > sort属性值

Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessionFactory; static{ //获取配置信息 hibernate.cfg.xml Configuration configuration = new Configuration().configure(); //创建一个 ServiceRegistry的实例 //首先获得其标准建造器,此处用

hibernate 联合主键生成机制(组合主键XML配置方式)

hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体如下: 可以使用一个组件作为一个实体类的标识符.你的组件类必须满足以下要求: 它必须实现 java.io.Serializable 接口 它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 注意:在 Hibernate3 中,第二个要求并非是 Hi

hibernate联合主键不便之处(转)

在使用hibernate的联合主键时有以下几个需要注意的问题: 1.首先就是映射文件中联合主键的写法, 例子: Java代码   <composite-id name="sid" class="cn.test.po.IpAndSubphoneId"> <key-property name="ip" type="java.lang.String"> <column name="IP&quo

hibernate联合主键

一. hibernate联合主键类的规则 1. 实现Serializable接口 2. 重写hashCode与equals方法 二.hibernate联合主键的实体类规则原因(与上面规则顺序对应) 1. Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象.这反映到程序领域中就是根据hashCode与equals方法来判断某两个对象是否能够放到诸如Set这样的集合当中: 2. 使用get或load方法的时候需要先

hibernate 注解 联合主键映射

联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将 该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并生成set和get方法,并将该引用注 解为@Id 第二.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,最后 在主类中(该

IT忍者神龟之Hibernate联合主键下,主键生成策略

如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体如下: 可以使用一个组件作为一个实体类的标识符.你的组件类必须满足以下要求: 它必须实现 java.io.Serializable 接口 它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 注意:在 Hibernate3 中,第二个要求并非是 Hibernate 强制必须的.但最好这样做. 不能使用一个 Ide

hibernate 复合主键映射

第一次写博客,只想把工作中遇到的问题记下来. 最近做了一个二次开发的改造,改完之后被告知数据表主键根据需求需要用复合主键,因为本人菜鸟一枚,复合主键从未用过,只能靠度娘 网上给出的复合主键映射大致就两种 第一种:将复合主键对应的属性与实体其他普通属性放在一起 /*实体类.复合主键必须实现Serialzable接口*/ public class User implements Serialzable { private static final long serialVersionUID=1L;/

hibernate 联合主键

xml配置 需要一个主键类: package com.bxw.entity; import java.io.Serializable; public class StudentPk implements Serializable{ private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public Str