下面使用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;
- }
- }
相关推荐
本文将详细介绍如何使用Hibernate注解来定义联合主键。 首先,我们需要了解联合主键的定义方式。在Hibernate API中,有三种方法来定义联合主键: 1. 使用`@Embeddable`注解定义一个独立的主键类,然后将这个类的...
在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架(Java Persistence API,简称...
在JPA中,我们可以通过`@IdClass`或`@EmbeddedId`注解来定义联合主键。 #### `@IdClass` 使用`@IdClass`注解时,我们需要创建一个新的类来表示联合主键,并在这个类上使用`@Id`注解来标记每一个组成主键的属性。...
在Hibernate中,我们可以使用`@Embeddable`和`@EmbeddedId`注解来定义和使用联合主键。 1. **创建联合主键类:** 在MyEclipse中,我们首先创建一个Java类来表示联合主键。这个类需要被标记为`@Embeddable`,并包含...
在JPA中,我们可以通过`@IdClass`或`@EmbeddedId`注解来定义联合主键。 ### 2. `@IdClass` 实现联合主键 `@IdClass`注解用于定义一个独立的类来代表联合主键。这个类需要包含所有主键字段,并且每个字段都要用`@Id...
在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来定义联合主键。`@IdClass`是将主键类作为单独的实体,而`@EmbeddedId`则是将主键字段嵌入到实体类中。 1. **使用@IdClass** 使用`@IdClass`时,你需要创建一...
在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass**:这种方式需要创建一个单独的类来表示联合主键,这个类需要实现Serializable接口,并且每个主键字段都用@Id注解标识。然后在...
1. **使用`@IdClass`注解**:你可以定义一个类作为联合主键的载体,这个类包含所有组成主键的属性,并且每个属性都标记为`@Id`。然后在实体类上使用`@IdClass`注解,指定这个联合主键类。 ```java public class ...
1. 首先,定义联合主键类`PassportId`: ```java import javax.persistence.Embeddable; import java.io.Serializable; @Embeddable public class PassportId implements Serializable { private String personId;...
同时,Hibernate的Criteria API或HQL(Hibernate Query Language)可以帮助进行复杂的数据库查询,包括涉及多表连接的查询,这些查询可能涉及到联合主键和外键的使用。 综上所述,SSH2+JSON的结合提供了强大的后端...
接下来,我们需要在对应的实体类中使用`@EmbeddedId`注解引用我们的复合主键类。例如: ```java import javax.persistence.Entity; import javax.persistence.EmbeddedId; import javax.persistence.Table; @...
Hibernate 提供了多种继承映射策略,如 `@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`、`@DiscriminatorColumn` 和 `@DiscriminatorValue`,以支持单表继承、子类表和联合主键等。 #### 映射关联关系 - ...
多主键,也称为复合主键或联合主键,指的是在一个数据表中使用两个或更多的字段共同作为唯一标识符,确保每条记录的唯一性。这种设计常见于关系型数据库中,当单一字段不足以唯一标识一条记录时采用。例如,在一个...
- `@Id`:标识实体类中的主键字段,通常与`GeneratedValue`配合使用来生成主键值。 - `@GeneratedValue`:指定主键生成策略,如`GenerationType.IDENTITY`(自动增长)、`GenerationType.SEQUENCE`(序列)等。 -...
- 通过在实体类上使用 @IdClass 注解来定义联合主键。 通过上述内容的梳理,我们可以清晰地了解到 JPA 的核心概念、关键技术和实践方法,这对于深入理解 JPA 以及在实际项目中应用 JPA 至关重要。
在 MyBatis-Plus 中,可以使用 `@TableId` 注解来指定主键字段及其生成策略。例如: ```java @TableName("t_article") public class TArticle extends Model<TArticle> { private static final long ...
通过上述内容可以看出,Hibernate提供了丰富的注解机制来简化实体Bean的声明、属性的映射、表的定义、主键和外键的定义、关联关系的建立、查询的定义等。这些注解极大地提高了开发效率,并有助于构建清晰、灵活且...
1. 使用`@IdClass`或XML中的`composite-id`定义联合主键。 2. 联合主键需要重写equals和hashCode方法,实现Serializable接口。 七、Hibernate核心接口 1. `Configuration`接口: - 提供了管理配置信息的方法,用于...
### EJB注释精解 #### 一、EJB注释概述 ...此外,实体Bean的配置通过`persistence.xml`文件进行管理,而实体Bean本身则通过各种注释来定义其映射关系和主键策略。了解这些注释及其用法对于高效地开发EJB应用至关重要。