`
a3mao
  • 浏览: 562985 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate的联合主键

    博客分类:
  • Work
阅读更多
一个项目中,数据库的一个表用了联合主键,以前都是用jdbc来做的,现在要改用hibernate来做,在网上找了些资料,都提到联合主键的问题。大家都不推荐使用联合主键,关键是因为其需要自己手工维护,比较麻烦。数据库已经定好了,由于一些原因没办法更改了,所以只能这样做了。
数据库表:
if exists (select * from dbo.sysobjects where id = object_id('dbo.FRX_TRADE_SEQUENCE') and type = 'U')
drop table [dbo].[FRX_TRADE_SEQUENCE]
GO
CREATE TABLE [dbo].[FRX_TRADE_SEQUENCE](
     [TREASURY_BRANCH_CD]        not null,
     [KEY_DT] [datetime]       not null,
     [SEQ_NUM] [SeqNum]       not null
) on [default]

GO

alter table dbo.FRX_TRADE_SEQUENCE add primary key (TREASURY_BRANCH_CD, KEY_DT)

GO


Model: 共两个,TradeSequence 和 TradeSequenceId。

TradeSequence :

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

/**
* FrxTradeSequence generated by hbm2java
*/
@Entity
@Table(name = "FRX_TRADE_SEQUENCE")
public class TradeSequence implements java.io.Serializable {

private TradeSequenceId id;
private Integer seqNum;

public TradeSequence() {
}

public TradeSequence(TradeSequenceId id, Integer seqNum) {
this.id = id;
this.seqNum = seqNum;
}

@EmbeddedId
@AttributeOverrides( {
@AttributeOverride(name = "treasuryBranchCd", column = @Column(name = "TREASURY_BRANCH_CD", nullable = false, length = 12)),
@AttributeOverride(name = "keyDt", column = @Column(name = "KEY_DT", nullable = false, length = 23)) })
public TradeSequenceId getId() {
return this.id;
}

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

@Column(name = "SEQ_NUM", nullable = false)
public Integer getSeqNum() {
return this.seqNum;
}

public void setSeqNum(Integer seqNum) {
this.seqNum = seqNum;
}

}

TradeSequenceId :

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Embeddable;

/**
* FrxTradeSequenceId generated by hbm2java
*/
@Embeddable
public class TradeSequenceId implements java.io.Serializable {

private String treasuryBranchCd;
private Date keyDt;

public TradeSequenceId() {
}

public TradeSequenceId(String treasuryBranchCd, Date keyDt) {
this.treasuryBranchCd = treasuryBranchCd;
this.keyDt = keyDt;
}

@Column(name = "TREASURY_BRANCH_CD", nullable = false, length = 12)
public String getTreasuryBranchCd() {
return this.treasuryBranchCd;
}

public void setTreasuryBranchCd(String treasuryBranchCd) {
this.treasuryBranchCd = treasuryBranchCd;
}

@Column(name = "KEY_DT", nullable = false, length = 23)
public Date getKeyDt() {
return this.keyDt;
}

public void setKeyDt(Date keyDt) {
this.keyDt = keyDt;
}

}


对此表的操作,需求是要根据主键 treasuryBranchCd 和 keyDt 使字段seqNum实现自增。即每次调用时加1.
TradeSequenceId tid = new TradeSequenceId();
tid.setKeyDt(keyDate);
tid.setTreasuryBranchCd(treasuryBranchCd);
TradeSequence ts = new TradeSequence();
ts.setId(tid);

DetachedCriteria criteria = DetachedCriteria.forClass(TradeSequence.class);
criteria.add(Restrictions.idEq(tid));
List list = manager.findByCriteria(criteria);
if(list!=null && list.size()>0)
{
ts = (TradeSequence)(list.get(0));
ts.setSeqNum(ts.getSeqNum()+1);
}
else
{
ts.setSeqNum(new Integer(1));
}
manager.save(ts);

                  System.out.println("返回的SeqNum="+ts.getSeqNum());

在Hibernate3、tomcat6、JDK1.6环境下测试成功。
分享到:
评论

相关推荐

    hibernate联合主键全攻略

    ### Hibernate联合主键详解 #### 1. 定义联合主键 在Hibernate中定义联合主键主要依赖于`<composite-id>`标签。如示例文件所示,`Users`类被设计为具有联合主键,该主键由`name`和`tel`两个字段组成。在`...

    Hibernate联合主键的例子

    在Java持久化框架Hibernate中,联合主键(Composite Key)是一种特殊的数据结构,用于标识数据库表中的一条记录。与单个字段作为主键不同,联合主键由两个或更多个字段共同组成,形成一个唯一的标识。在本教程中,...

    hibernate的联合主键怎么设置

    在 Hibernate 中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这种主键在数据库设计中常见于需要多个字段唯一标识一条记录的情况。在 Hibernate 中设置联合主键通常需要以下几个步骤: 1. **...

    Hibernate注解映射联合主键

    在Java的持久化框架Hibernate中,联合主键(Composite Key)是一种特殊的数据模型设计,用于处理具有多个字段作为主键的实体。联合主键通常在数据表中的某些列共同决定了唯一标识的情况出现。在Hibernate中,有三种...

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

    在Java Hibernate框架中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这在处理一些特定的数据模型时非常有用。本文将详细介绍如何使用Hibernate注解来定义联合主键。 首先,我们需要了解联合...

    hibernate复合主键配置和使用

    《Hibernate复合主键配置与使用详解》 在Java开发中,Hibernate作为一款强大的ORM框架,大大简化了数据库操作。然而,当我们面临复杂的数据表结构,尤其是涉及到复合主键时,如何在Hibernate中进行配置和使用就显得...

    hibernate复合主键映射

    复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射

    Hibernate复合主键视频2

    请更名为 Hibernate复合主键.part2.rar

    hibernate复合主键的实例

    在某些情况下,单一字段无法唯一标识表中的记录,此时需要多个字段联合起来作为主键。例如,考虑一个学生选课表,可能包含"学生ID"和"课程ID",这两者结合才能唯一确定学生选修的特定课程。 三、Hibernate中复合...

    Hibernate教程08_关系映射之联合主键

    在Hibernate中,实现联合主键可以通过使用`@Embeddable`和`@EmbeddedId`注解。首先,我们需要创建一个包含所有主键字段的类,并使用`@Embeddable`标记。这个类通常会作为其他实体类的属性,用`@EmbeddedId`注解。...

    JPA注解实现联合主键

    ### JPA注解实现联合主键 在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架...

    Hibernate一对一单向外键关联 (联合主键annotation)

    本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...

    SSH2+JSO与三表联合主外键

    同时,Hibernate的Criteria API或HQL(Hibernate Query Language)可以帮助进行复杂的数据库查询,包括涉及多表连接的查询,这些查询可能涉及到联合主键和外键的使用。 综上所述,SSH2+JSON的结合提供了强大的后端...

    Hibernate 系列教程 单向一对多

    为了提高性能,我们可以使用`fetch="join"`(XML映射)或`@Fetch(FetchMode.JOIN)`(注解)进行联合查询,一次性获取所有关联的数据。 理解并熟练掌握Hibernate的单向一对多关联,能够帮助开发者更高效地处理复杂的...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    - 联合主键是多个字段共同构成的主键,可以通过@EmbeddedId和@Embeddable注解实现。 - 复合主键是自动生成的主键,通过@TableGenerator或@IdClass实现。 **8. 异常处理** - Hibernate提供了自己的异常体系,如...

    Hibernate实体关系映射

    Hibernate实体关系映射

    Hibernate笔记 马士兵

    第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 ...三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........

    hibernate 3.6 中文 chm

    在Hibernate中,这种继承关系也可以被映射到数据库,如单表继承、联合继承和表-per-hierarchy等策略。 12. **延迟加载(Lazy Loading)**:为了提高性能,Hibernate支持属性和关联的延迟加载,即只有在真正需要时才...

    Hibernate原理解析

    Hibernate支持多种关系映射,如一对一、一对多、多对一和多对多,包括集合映射、联合主键映射等,使得复杂的数据关系得以轻松管理。 10. **实体生命周期** Hibernate管理着对象的生命周期,包括初始化、持久化、...

Global site tag (gtag.js) - Google Analytics