hibernate的@EmbeddedId注解的使用

一,前言

当我们为项目设计表的时候,有时候会需要用复合主键来标识唯一,若项目的持久层采用了hibernate框架,则可以使用@EmbeddedId注解来实现该需求。

二,表设计

CREATE TABLE `mkt_mas_cpcus` (
  `CR_ORG_NBR` decimal(3,0) NOT NULL DEFAULT '0' COMMENT '机构号',
  `CR_ACCT_NBR` decimal(16,0) NOT NULL DEFAULT '0' COMMENT '持卡人代号',
  `CR_STATUS` decimal(1,0) DEFAULT NULL COMMENT '状态',
  `CR_SHORT_NAME` varchar(15) DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`CR_ORG_NBR`,`CR_ACCT_NBR`)
)

该表中,机构号CR_ORG_NBR 和 持卡人代号CR_ACCT_NBR 作为复合主键,唯一标识一条数据。

三,创建复合主键类

@Embeddable
public class MasCpcusPK implements Serializable {
    private static final long serialVersionUID = 1L;

    private BigDecimal crAcctNbr; // 持卡人代号
    private BigDecimal crOrgNbr; // 机构号

    public MasCpcusPK() {
    }  
    @Basic
    @Column(name="CR_ACCT_NBR")
    public BigDecimal getCrAcctNbr() {
        return this.crAcctNbr;
    }
    public void setCrAcctNbr(BigDecimal crAcctNbr) {
        this.crAcctNbr = crAcctNbr;
    }
    @Basic
    @Column(name="CR_ORG_NBR")
    public BigDecimal getCrOrgNbr() {
        return this.crOrgNbr;
    }
    public void setCrOrgNbr(BigDecimal crOrgNbr) {
        this.crOrgNbr = crOrgNbr;
    }
}

四,创建po类,采用了hibernate注解

用复合主键代替那两个属性,在get方法上,加上@EmbeddedId注解。

@Entity
@Table(name = "mkt_mas_cpcus", schema = "market", catalog = "")
public class MktMasCpcus implements Serializable {

    private static final long serialVersionUID = -8509123963537411929L;

    private MasCpcusPK id; // 复合主键

    private BigDecimal crStatus; // 客户状态

    private String crShortName; // 姓名

    @EmbeddedId
    public MasCpcusPK getId() {
        return id;
    }

    public void setId(MasCpcusPK id) {
        this.id = id;
    }
    @Basic
    @Column(name = "CR_STATUS")
    public BigDecimal getCrStatus() {
        return crStatus;
    }

    public void setCrStatus(BigDecimal crStatus) {
        this.crStatus = crStatus;
    }

    @Basic
    @Column(name = "CR_SHORT_NAME")
    public String getCrShortName() {
        return crShortName;
    }

    public void setCrShortName(String crShortName) {
        this.crShortName = crShortName;
    }
}

五,创建DAO层

由于是复合主键,那么泛型中的主键就要写这个复合主键MasCpcusPK。

public interface MktMasCpcusDao extends JpaRepository<MktMasCpcus, MasCpcusPK> {

}

若是要调用Dao层的接口,根据id查询的时候,id就要传MasCpcusPK。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这里是一个简单的例子: 假设我们有一个学生信息表,表结构如下: ```sql CREATE TABLE student ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, gender TINYINT NOT NULL, age INT NOT NULL, PRIMARY KEY (id) ); ``` 我们可以通过以下实体类来映射这个表: ```java @Entity @Table(name = "student") public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "gender") private Integer gender; @Column(name = "age") private Integer age; // getters and setters } ``` - `@Entity` 注解表示这是一个实体类,需要被 JPA 管理。 - `@Table` 注解表示与之对应的表名。 - `@Id` 注解表示该字段是主键。 - `@GeneratedValue` 注解表示主键的生成策略,这里使用了 `GenerationType.IDENTITY`,表示使用自增长方式生成主键。 - `@Column` 注解表示该字段与表中的哪个列对应。 如果表中有联合主键的情况,可以使用 `@EmbeddedId` 注解。例如,我们有一个成绩表,表结构如下: ```sql CREATE TABLE score ( student_id INT NOT NULL, subject VARCHAR(50) NOT NULL, score INT NOT NULL, PRIMARY KEY (student_id, subject) ); ``` 我们可以通过以下实体类来映射这个表: ```java @Entity @Table(name = "score") public class Score { @EmbeddedId private ScoreKey id; @Column(name = "score") private Integer score; // getters and setters } @Embeddable public class ScoreKey implements Serializable { @Column(name = "student_id") private Long studentId; @Column(name = "subject") private String subject; // equals and hashCode } ``` - `@Embeddable` 注解表示这是一个嵌入式对象。 - 嵌入式对象 `ScoreKey` 作为主键,需要使用 `@EmbeddedId` 注解。 - 嵌入式对象中的字段需要使用 `@Column` 注解指定对应的列名。 以上代码只是一个简单的例子,实际使用时可能需要更多的注解和配置,具体可以根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值