联合主键用Hibernate注解映射方式主要有三种:

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

package com.test.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class TestPk implements Serializable{
    private static final long serialVersionUID = 1L;
    @Column(name="id")
    private int id;
    @Column(name="sid")
    private String sid;

public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getSid() {
        return sid;
    }
    public void setSid(String sid) {
        this.sid = sid;
    }
}

package com.test.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name="test")
@Entity
public class Test1 {
    @Column(name="date")
    private String date;
    @Id
    private TestPk testPk;
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public TestPk getTestPk() {
        return testPk;
    }
    public void setTestPk(TestPk testPk) {
        this.testPk = testPk;
    }

}

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

package com.test.entity;

import java.io.Serializable;

import javax.persistence.Column;

public class TestPk implements Serializable{
    private static final long serialVersionUID = 1L;
    @Column(name="id")
    private int id;
    @Column(name="sid")
    private String sid;

public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getSid() {
        return sid;
    }
    public void setSid(String sid) {
        this.sid = sid;
    }
}
package com.test.entity;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
@Table(name="test")
@Entity
public class Test1 {
    @Column(name="date")
    private Date date;
    @EmbeddedId
    private TestPk testPk;
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public TestPk getTestPk() {
        return testPk;
    }
    public void setTestPk(TestPk testPk) {
        this.testPk = testPk;
    }

}

第三、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并要重写equals和hashcode.最后在主类中(该类包含联合主键类中的字段)将联合主键字段都注解为@Id,并在该类上方将上这样的注解:@IdClass(联合主键类.class)

package com.test.entity;

import java.io.Serializable;

import javax.persistence.Column;

public class TestPk implements Serializable{
    private static final long serialVersionUID = 1L;
    @Column(name="id")
    private int id;
    @Column(name="sid")
    private String sid;

public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getSid() {
        return sid;
    }
    public void setSid(String sid) {
        this.sid = sid;
    }
}
package com.test.entity;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
@Table(name="test")
@IdClass(TestPk.class)
@Entity
public class Test1 {
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getSid() {
        return sid;
    }
    public void setSid(String sid) {
        this.sid = sid;
    }
    @Column(name="date")
    private Date date;
    @Id
    private int id;
    @Id
    private String sid;
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }

}

序列化原因 :如果多个该类对象同时放入内存中,在一个集群系统中,

其中一台服务器当机了,需要将内存中对象写到其它服务器。

同时,如果该服务器内存以满,需要用虚拟内存,这就需要序列化后才能写到硬盘上

重写hashCode()和equal()方法 原因 : 这是为了保证对象唯一性的。

将许多对象放在内存中,他们之间用什么区分呢?数据库中用那个主键来区分的,

因此在这儿应该重写hashCode()和equal()方法

转自CSDN:  https://blog.csdn.net/u014520047/article/details/52302463

转载于:https://www.cnblogs.com/dauber/p/9116280.html

Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法...相关推荐

  1. hibernate中联合主键要同时重写hashCode()和equals()方法

    关于联合主键 联合主键为什么要重写equals方法和hashCode方法,是为了保证唯一性 1.在数据库保证唯一性是使用的联合主键 2.把一系列的对象放到内存的时候,为了区分同名对象,数据库是使用联合 ...

  2. HashMap存储自定义类型键值: 重写HashCode和equals方法

    一个团体作为一个HashMap的key值,若团体成员的姓名年龄相同,则看作key值相同 因为是自定义类,所以需要重写HashCode和equals方法 public class RedVelvet { ...

  3. hibernate 联合主键 merge

    http://topic.csdn.net/u/20090722/16/1946dd91-3900-47e9-ab85-ed7db41252de.html Object obj=session.mer ...

  4. JPA规范:一对多、一对一、多对多的双向关联与级联操作以及JPA联合主键

    通常在企业开发中,开发Dao层有两种做法:  (1)先建表,后再根据表来编写配置文件和实体bean.使用这种方案的开发人员受到了传统数据库建模的影响.  (2)先编写配置文件和实体bean,然后再生成 ...

  5. Java实体类设置联合主键_javahibernate使用注解来定义联合主键

    java hibernate使用注解来定义联合主键 下面使用hibernate的API中说明的三种方式来定义主键,主要使用Annotation来定义hibernate中的联合主键 下面取至hibern ...

  6. MyBatis联合主键结果集与SQL查询结果不一致的问题

    2019独角兽企业重金招聘Python工程师标准>>> 一.问题 如果select中的联合主键组合成的key不唯一(当只select部分联合主键时可能发生),那么就会把相同的key合 ...

  7. hibernate联合主键

    2019独角兽企业重金招聘Python工程师标准>>> 在日常开发中,有时候会出现要求两个或以上字段联合做主键的表,就两个字段做主键为例,用户表的联合主键为firstname和las ...

  8. 自底向上带你逆向解析hibernate联合主键

    参考1.参考2 文章目录 1 最后生成具有复合主键的表 2 People.hbm.xml文件 3 配置映射 4 java类 5 action中联合主键赋值方式 1 最后生成具有复合主键的表 数据库表的 ...

  9. hibernate 联合主键

    xml方式处理联合主键: 以有两个主键:id和name的student表为例. 先创建个主键类: package com.bjsxt.hibernate; //黑色为必写项 public class ...

最新文章

  1. memcache协议
  2. 汉字转拼音插件:LM-PinYin.js
  3. MongoDB -- Error: unclean shutdown detected
  4. Android——应用图标微技巧,系统中应用图标的适配
  5. torchvision.datasets.ImageFolder使用详解
  6. codeforces679C Bear and Square Grid(dfs优化)
  7. java实现字块反转_java实现字符串反转
  8. Django model select的各种用法详解
  9. 并不对劲的bzoj5340:loj2552:uoj399:p4564: [Ctsc2018]假面
  10. VMware报错“锁定文件失败“解决方法
  11. heart ultrasound from american society of echocardiography
  12. ZEGO 自研客户端配置管理系统 —— 云控
  13. 硬盘容量和计算机容量的换算,t和g的换算(硬盘容量G跟T的换算)
  14. 【Bug】Microsoft Edge拒绝访问
  15. Ameba 博客 词汇语法句型 20141101
  16. 浅谈超融合一体机-即买即用的企业级私有云
  17. CPU也能加速AlphaFold2!英特尔最新发布:23倍通量优化指南!
  18. 漏洞挖掘之 SQL 注入挖掘
  19. Development模式是如何运作的?
  20. Redhat linux 安装 gcc编译器,Gcc源码包,rpm包安装方法!

热门文章

  1. 华南理工大学广州学院计算机二级,华南理工大学广州学院学子在第三届“泰迪杯”数据分析职业技能大赛中荣获佳绩...
  2. linux 文件系统 簇 浪费空间,Linux rm -rf删除文件不释放空间的解决办法
  3. python 微信机器人_Python 微信机器人
  4. JSX详解React的事件绑定事件参数的传递
  5. LeetCode 2194. Excel 表中某个范围内的单元格
  6. python 迭代器、生成器、yield、iter
  7. LeetCode 1686. 石子游戏 VI(贪心)
  8. LeetCode 1135. 最低成本联通所有城市(最小生成树+排序+并查集)
  9. LeetCode 734. 句子相似性(哈希)
  10. LeetCode 359. 日志速率限制器(哈希map)