下面使用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;
- }
- }