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.类文件 这

  • 详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)

    一.整合原理 二.导包(41个) 1.hibernate (1)hibernate/lib/required (2)hibernate/lib/jpa | java persist api java的持久化规范(接口) (3)数据库驱动 2.struts2 (1)struts-blank.war/WEB-INF/lib/* 注意:javassist-3.18.1-GA.jar包与hibernate中的重复(只保留高版本即可) (2)struts整合spring插件包 注意:这个包一旦导入,那么s

  • JAVA中通过Hibernate-Validation进行参数验证

    在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而hibernate-validator提供了一些常用的参数校验注解,我们可以拿来使用. 1.maven中引入hibernate-validator对应的jar: <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4

  • 在Java的Hibernate框架中使用SQL语句的简单介绍

    Hibernate中有HQL查询语法.但我们用得比较熟的还是数SQL语句,那么应该怎么来让Hibernate支持SQL呢?这个不用我们去考虑了,Hibernate团队已经早就做好了.        废话不说,直接来例子啦. select * from t_user usr 上面是一条SQL语句,又是废话,是个人都知道.我们想让Hibernate执行这条语句,怎么办呢?看代码: Query query = session.createSQLQuery("select * from t_user u

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

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

  • Java框架篇:Spring+SpringMVC+hibernate整合开发

    前言: 最近没什么事做,搭个框架写成博客记录下来,拉通一下之前所学知识. 话不多说,我们直接步入正题. 准备工作: 1/安装并配置java运行环境 2/数据库的安装配置(Mysql) 3/安装并配置服务器(Tomcat) 4/Maven 5/ IntelliJIDEA的安装配置(本人使用的主要软件是IntelliJIDEA,没用eclipse什么的) 6/ 使用IntelliJIDEA创建一个web app项目. 貌似就这些了吧 导包 不同于以往的导包,由于我们创建的是maven的webapp项

  • Java web Hibernate如何与数据库链接

    java web添加structs特性后再添加Hibernate特性,这可以通过右键工程->my eclipse出现工具条选中相应的条目,添加相应的属性, 添加完Hibernate后建立与数据库的链接,然后就可以进行反向了, 讲一下建立数据库连接: 在my eclipse中选中window->other perspective 打开DB browser,如下图: 接下来在空白处右键,新建连接即可弹出如下对话框: 接下来选择相应的Driver template一般和数据库有关,mysql一般选M

  • 从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate

    本文会介绍从一个最基本的java工程,到Web工程,到集成Spring.SpringMVC.SpringDataJPA+Hibernate. 平时我们可能是通过一个模板搭建一个工程,或者是直接导入一个项目,而本文选择从最基本的java工程开始,目的是为了展示更多原理. 当然,我们还是从一个最基本的Maven工程开始,其实普通的非Maven工程,搭建过程几乎是一模一样的,只是Jar包需要我们手动的添加到工程中,而Maven工程就只是修改配置文件即可. 下面就正式开始. 1.基于Maven(如果不使

  • 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 必须不能为空字段

随机推荐