java hibernate使用注解来定义联合主键

java  hibernate使用注解来定义联合主键

下面使用hibernate的API中说明的三种方式来定义主键,主要使用Annotation来定义hibernate中的联合主键

下面取至hibernate的API文档:

定义组合主键的几种语法:

1、将组件类注解为@Embeddable,并将组件的属性注解为@Id
2、将组件的属性注解为@EmbeddedId
3、将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id

下面就分别使用这三种方式来定义联合主键。

建表的SQL语句:

CREATE TABLE `syslogs` (
 `id` varchar(50) NOT NULL,
 `yhid` varchar(50) NOT NULL,
 `modelname` varchar(100) DEFAULT NULL,
 `content` varchar(500) DEFAULT NULL,
 `inserttime` varchar(20) DEFAULT NULL,
 `remark` varchar(50) DEFAULT NULL,
 PRIMARY KEY (`id`,`yhid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf-8;

一、将组件类注解为@Embeddable

/**
 * SysLogsDtoId代表主键类
 */
package com.hibernate.dto; 

import javax.persistence.Embeddable;
/**
 * 1、主键类必须要实现java.io.Serializable接口
 * 2、主键类必须要重写equals和hashCode方法
 * @author ibm
 */
@Embeddable
public class SysLogsDtoId implements java.io.Serializable { 

  private static final long serialVersionUID = 1L;
  private String id;
  private String yhid; 

  public SysLogsDtoId() {
  } 

  public SysLogsDtoId(String id, String yhid) {
    this.id = id;
    this.yhid = yhid;
  } 

  public String getId() {
    return this.id;
  } 

  public void setId(String id) {
    this.id = id;
  } 

  public String getYhid() {
    return this.yhid;
  } 

  public void setYhid(String yhid) {
    this.yhid = yhid;
  } 

  public boolean equals(Object other) {
    if ((this == other))
      return true;
    if ((other == null))
      return false;
    if (!(other instanceof SysLogsDtoId))
      return false;
    SysLogsDtoId castOther = (SysLogsDtoId) other; 

    return ((this.getId() == castOther.getId()) || (this.getId() != null && castOther.getId() != null && this.getId().equals(castOther.getId())))
        && ((this.getYhid() == castOther.getYhid()) || (this.getYhid() != null && castOther.getYhid() != null && this.getYhid().equals(
            castOther.getYhid())));
  } 

  public int hashCode() {
    int result = 17; 

    result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());
    result = 37 * result + (getYhid() == null ? 0 : this.getYhid().hashCode());
    return result;
  } 

}
/**
 * SysLogsDto为表对象映射类,其中主键为主键类SysLogsDtoId
 */
package com.hibernate.dto; 

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table; 

@Entity
@Table(name = "syslogs")
public class SysLogsDto implements java.io.Serializable {
  private static final long serialVersionUID = 1L;
  private SysLogsDtoId id;
  private String modelname;
  private String content;
  private String inserttime;
  private String remark; 

  public SysLogsDto() {
  } 

  public SysLogsDto(SysLogsDtoId id) {
    this.id = id;
  } 

  public SysLogsDto(SysLogsDtoId id, String modelname, String content, String inserttime, String remark) {
    this.id = id;
    this.modelname = modelname;
    this.content = content;
    this.inserttime = inserttime;
    this.remark = remark;
  } 

  @Id
  public SysLogsDtoId getId() {
    return this.id;
  } 

  public void setId(SysLogsDtoId id) {
    this.id = id;
  } 

  @Column(name = "modelname", length = 100)
  public String getModelname() {
    return this.modelname;
  } 

  public void setModelname(String modelname) {
    this.modelname = modelname;
  } 

  @Column(name = "content", length = 500)
  public String getContent() {
    return this.content;
  } 

  public void setContent(String content) {
    this.content = content;
  } 

  @Column(name = "inserttime", length = 20)
  public String getInserttime() {
    return this.inserttime;
  } 

  public void setInserttime(String inserttime) {
    this.inserttime = inserttime;
  } 

  @Column(name = "remark", length = 50)
  public String getRemark() {
    return this.remark;
  } 

  public void setRemark(String remark) {
    this.remark = remark;
  } 

}

二、将组件的属性注解为@EmbeddedId

这种情况最简单,主键类只用定义主键字段,不需要写任何注解。然后在对象类中在主键类的get方法上加上@EmbeddedId注解。

/**
 * SysLogsDtoId代表主键类
 */
package com.hibernate.dto; 

public class SysLogsDtoId implements java.io.Serializable { 

  private static final long serialVersionUID = 1L;
  private String id;
  private String yhid; 

  public SysLogsDtoId() {
  } 

  public SysLogsDtoId(String id, String yhid) {
    this.id = id;
    this.yhid = yhid;
  } 

  public String getId() {
    return this.id;
  } 

  public void setId(String id) {
    this.id = id;
  } 

  public String getYhid() {
    return this.yhid;
  } 

  public void setYhid(String yhid) {
    this.yhid = yhid;
  } 

  public boolean equals(Object other) {
    if ((this == other))
      return true;
    if ((other == null))
      return false;
    if (!(other instanceof SysLogsDtoId))
      return false;
    SysLogsDtoId castOther = (SysLogsDtoId) other; 

    return ((this.getId() == castOther.getId()) || (this.getId() != null && castOther.getId() != null && this.getId().equals(castOther.getId())))
        && ((this.getYhid() == castOther.getYhid()) || (this.getYhid() != null && castOther.getYhid() != null && this.getYhid().equals(
            castOther.getYhid())));
  } 

  public int hashCode() {
    int result = 17; 

    result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());
    result = 37 * result + (getYhid() == null ? 0 : this.getYhid().hashCode());
    return result;
  } 

}

/**
 * SysLogsDto为表对象映射类,其中主键为主键类SysLogsDtoId
 */
package com.hibernate.dto; 

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table; 

@Entity
@Table(name = "syslogs")
public class SysLogsDto implements java.io.Serializable {
  private static final long serialVersionUID = 1L;
  private SysLogsDtoId id;
  private String modelname;
  private String content;
  private String inserttime;
  private String remark; 

  public SysLogsDto() {
  } 

  public SysLogsDto(SysLogsDtoId id) {
    this.id = id;
  } 

  public SysLogsDto(SysLogsDtoId id, String modelname, String content, String inserttime, String remark) {
    this.id = id;
    this.modelname = modelname;
    this.content = content;
    this.inserttime = inserttime;
    this.remark = remark;
  } 

  @EmbeddedId
  public SysLogsDtoId getId() {
    return this.id;
  } 

  public void setId(SysLogsDtoId id) {
    this.id = id;
  } 

  @Column(name = "modelname", length = 100)
  public String getModelname() {
    return this.modelname;
  } 

  public void setModelname(String modelname) {
    this.modelname = modelname;
  } 

  @Column(name = "content", length = 500)
  public String getContent() {
    return this.content;
  } 

  public void setContent(String content) {
    this.content = content;
  } 

  @Column(name = "inserttime", length = 20)
  public String getInserttime() {
    return this.inserttime;
  } 

  public void setInserttime(String inserttime) {
    this.inserttime = inserttime;
  } 

  @Column(name = "remark", length = 50)
  public String getRemark() {
    return this.remark;
  } 

  public void setRemark(String remark) {
    this.remark = remark;
  } 

}

三、将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id

/**
 * SysLogsDtoId代表主键类
 */
package com.hibernate.dto; 

public class SysLogsDtoId implements java.io.Serializable { 

  private static final long serialVersionUID = 1L;
  private String id;
  private String yhid; 

  public SysLogsDtoId() {
  } 

  public SysLogsDtoId(String id, String yhid) {
    this.id = id;
    this.yhid = yhid;
  } 

  public String getId() {
    return this.id;
  } 

  public void setId(String id) {
    this.id = id;
  } 

  public String getYhid() {
    return this.yhid;
  } 

  public void setYhid(String yhid) {
    this.yhid = yhid;
  } 

  public boolean equals(Object other) {
    if ((this == other))
      return true;
    if ((other == null))
      return false;
    if (!(other instanceof SysLogsDtoId))
      return false;
    SysLogsDtoId castOther = (SysLogsDtoId) other; 

    return ((this.getId() == castOther.getId()) || (this.getId() != null && castOther.getId() != null && this.getId().equals(castOther.getId())))
        && ((this.getYhid() == castOther.getYhid()) || (this.getYhid() != null && castOther.getYhid() != null && this.getYhid().equals(
            castOther.getYhid())));
  } 

  public int hashCode() {
    int result = 17; 

    result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());
    result = 37 * result + (getYhid() == null ? 0 : this.getYhid().hashCode());
    return result;
  } 

}
/**
 * SysLogsDto为表对象映射类,其中主键为主键类SysLogsDtoId
 */
package com.hibernate.dto; 

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table; 

@Entity
@Table(name = "syslogs")
@IdClass(value=SysLogsDtoId.class)
public class SysLogsDto implements java.io.Serializable {
  private static final long serialVersionUID = 1L;
  private String id;
  private String yhid;
  private String modelname;
  private String content;
  private String inserttime;
  private String remark; 

  public SysLogsDto() {
  } 

  @Id
  public String getId() {
    return id;
  } 

  public void setId(String id) {
    this.id = id;
  } 

  @Id
  public String getYhid() {
    return yhid;
  } 

  public void setYhid(String yhid) {
    this.yhid = yhid;
  } 

  @Column(name = "modelname", length = 100)
  public String getModelname() {
    return this.modelname;
  } 

  public void setModelname(String modelname) {
    this.modelname = modelname;
  } 

  @Column(name = "content", length = 500)
  public String getContent() {
    return this.content;
  } 

  public void setContent(String content) {
    this.content = content;
  } 

  @Column(name = "inserttime", length = 20)
  public String getInserttime() {
    return this.inserttime;
  } 

  public void setInserttime(String inserttime) {
    this.inserttime = inserttime;
  } 

  @Column(name = "remark", length = 50)
  public String getRemark() {
    return this.remark;
  } 

  public void setRemark(String remark) {
    this.remark = remark;
  } 

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java的Hibernate框架中复合主键映射的创建和使用教程

    复合主键映射需要在映射配置文件中使用<composite-id>标签,该标签是指将一个类指定为相应的复合主键,它的name属性需要指定类文件中定义的属性值,并在该标签中添加<key-property>子标签. Note:想要使用复合映射必须要将复合主键放到一个类中,也就是讲复合主键属性和其它属性分到两个类中,并将复合主键的类实现接口Serializable,该接口隶属于java.io. 复合主键的映射关系的主键是由多个列复合而成的,对应到数据表中相当的简单,如下图: 1.类文件 这

  • Java的Hibernate框架中的组合映射学习教程

    一.组合映射 组合是关联关系的一种特殊情况,是关联关系耦合度最高的一种关系,组合的主对象和子对象拥有相同的生命周期,主对像消亡的话子对象也会消亡.这里使用雇主和用户作为示例,用户和雇主都拥有联系方式属性,如果这里站在对象角度思考的话,常常会把对象模型绘制成为组合的方式,抽象出来一个共同的联系方式类,然后两种人分别包含相应的联系方式对象即可,向应的对象模型时它的对象示例如下图所示: 组合对象模型在生成相应的关系模型后会把对应的子类包含到主表中,所以对应的表结构会将相应的属性生成到对应的表中,相应的

  • Java探索之Hibernate主键生成策略详细介绍

    1.increment 由Hibernate从数据库中去除主键的最大值(每个session只取一次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库. <id name="id" column="id"> <generator class="increment" /> </id> Hibernate调用org.hibernate.id.IncrementGenerator类

  • Java Hibernate对象(瞬时态,持久态,脱管态)详解

    Java Hibernate对象            由于最近学习Java Hibernate,这里对Java Hibernate对象的几种状态进行了资料整理,  有兴趣的朋友可以看下. 瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交: 持久对象状态发生改变,在事务提交时

  • java Hibernate多对多映射详解及实例代码

    java Hibernate多对多映射 前言: 一.单向多对多 单向多对多的例子用人和职位来举例,一个人可以有多个职位,一个职位会有多个人.单向多对多是指只能在一端来查询获取另一端的内容.多对多的关系在生成关系模型时会生成对象之前的关联表,关联表中存放着两个关系表的主键,它们的关系如下所示: 代码部分:  (1)映射和关系类 因为是单向的关系,所以只需要在一端进行维护,所以我们需要在User.hbm.xml配置文件中添加<many-to-many>标签,并在标签中加上对应的列关系,在<s

  • Java的Hibernate框架结合MySQL的入门学习教程

    零.关于Hibernate Hibernate是冬眠的意思,它是指动物的冬眠,但是本文讨论的Hibernate却与冬眠毫无关系,而是接下来要讨论的SSH2框架中的一员.Hibernate是一个开源的项目,它是一个对象关系模型的框架,并且对JDBC进行了非常轻量级的封装,程序员在开发时可以使用对象编程思维进行开发. 下载地址:http://hibernate.org/orm/downloads/ Note:轻量级和重量级的区别,轻量级的框架包较小,并且使用较简单,而且测试容易,开发效率高:重量级框

  • java hibernate使用注解来定义联合主键

    java  hibernate使用注解来定义联合主键 下面使用hibernate的API中说明的三种方式来定义主键,主要使用Annotation来定义hibernate中的联合主键 下面取至hibernate的API文档: 定义组合主键的几种语法: 1.将组件类注解为@Embeddable,并将组件的属性注解为@Id 2.将组件的属性注解为@EmbeddedId 3.将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id 下面就分别使用这三种方式来定义联合主键. 建表的SQL语

  • java  hibernate使用注解来定义联合主键

    java  hibernate使用注解来定义联合主键 下面使用hibernate的API中说明的三种方式来定义主键,主要使用Annotation来定义hibernate中的联合主键 下面取至hibernate的API文档: 定义组合主键的几种语法: 1.将组件类注解为@Embeddable,并将组件的属性注解为@Id 2.将组件的属性注解为@EmbeddedId 3.将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id 下面就分别使用这三种方式来定义联合主键. 建表的SQL语

  • mybatis-plus拦截器、字段填充器、类型处理器、表名替换、SqlInjector(联合主键处理)

    目录 组件介绍 表名处理器 字段填充器 类型处理器 补充 最近有个练手的小例子,大概就是配置两个数据源,从一个数据源读取数据写到另一个数据源,虽然最后做了出来,但是不支持事务...就当是对mybatis-plus/mybatis组件使用方式的记录吧,本次例子使用的仍是mybatis-plus 回忆一下mybatis核心对象: Configuration 初始化基础配置,比如MyBatis的别名等,一些重要的类型对象,如,插件,映射器,ObjectFactory和typeHandler对象,MyB

  • Spring Data JPA 建立表的联合主键

    最近遇到了一个小的问题,就是怎么使用 Spring Data JPA 建立表的联合主键?然后探索出了下面的两种方式. 第一种方式: 第一种方式是直接在类属性上面的两个字段都加上 @Id 注解,就像下面这样,给 stuNo 和 stuName 这两个字段加上联合主键: @Entity @Table(name = "student") public class Student { @Id @Column(name = "stu_no", nullable = false

  • Mybatis批量修改联合主键数据的两种方法

    最近遇上需要批量修改有联合主键的表数据,网上找了很多文章,最终都没找到比较合适的方法,有些只能支持少量数据批量修改,超过十几条就不行了. 最终自己摸索总结了两种方式可以批量修改数据. 第一种: <update id="updateMoreEmpOrg" parameterType="java.util.List"> update hr_emp_org <trim prefix="set" suffixOverrides=&quo

  • oracle删除主键查看主键约束及创建联合主键

    1,主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY 执行上面的SQL可以删除主键:如果不成功可以用 ALTER TABLE TABLENAME DROP CONSTRAINTS COLUMN CASCADE; --删除约束 ALTER TABLE TABLENAME DISABLE PRIMARY_COLUMN ; --设置被设置为主键的列为无效 DROP INDEX INDEX_NAME; --删除主键索引 2,查看主键约束 SELECT * FROM

  • 初探SQL语句复合主键与联合主键

    一.复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键. 比如 create table test ( name varchar(19), id number, value varchar(10), primary key (name,id) ) 上面的name和id字段组合起来就是你test表的复合主键 ,它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性 ,一般情况下,主键的字段长度和字段数目要越少越

  • python django model联合主键的例子

    今天,在家试试django的model的设置,如何设置的联合主键,我经过查资料和实践,把结果记录如下: 例如: class user(Model): id=AutoField(primary_key=True) name = CharField(max_length=30) age =IntegerField() class role(Model): id=AutoField(primary_key=True) name=CharField(max_length=10) 这是两个model有一个

  • Java的Hibernate框架中的双向主键关联与双向外键关联

    一.双向主键关联 双向的主键关联其实是单向一对一主键关联的一种特殊情况,只不过要在关联对象的两端的映射文件中都要进行<one-to-one>的配置,另外还要在主映射的主键一端采用foreign外键关联属性. 这里同样使用Person和IdCard来讨论,一个人对应着一个唯一的身份证,而且一个身份证也唯一映射着一个人,所以这就产生了双向的关联关系,Person的主键同样也是IdCard的主键,分别是主键的同时也是外键,这种关联关系成为双向一对一映射,表现到关系模型中可如下图: 图中的两个表采用了

  • sql中设置联合主键的具体方法

    复制代码 代码如下: ALTER TABLE 表名字 ADD CONSTRAINT pk_表名字 PRIMARY KEY( SNumber, SDate ); SNumber SDate 必须不能为空字段

随机推荐