`
sjsky
  • 浏览: 913360 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate3 注释生成复合主键或者嵌入式主键的方法及实例

阅读更多
    blog迁移至:http://www.micmiu.com

    Hibernate不断发展,几乎成为Java数据库持久性的事实标准,因为它非常强大、灵活,而且具备了优异的性能。
    传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载。当然创建这些映射有很多方法,可以从已有数据库模式或Java类模型中自动创建,也可以手工创建。无论如何,您最终将获得大量的 Hibernate 映射文件,而且增加了我们的工作步骤。
    而现在我们可以借助新的 Hibernate Annotation 库,即可一次性将注释直接嵌入到您的 Java 类中,不再需要映射配置的xml文件,提供了一种强大及灵活的方法来声明持久性映射。
    本文主要讲解一下如果通过注释来创建复合主键以及嵌入式主键:
    比如系统有用户表(UserAccount) 角色表(Role) 用户角色关系表(UserRole)三张表,用户角色关系表中 userId、roleId 组成复合主键。
   一、先code 一个复合主键的类UserRolePK:作为符合主键类,要满足以下几点要求。
      1.必须实现Serializable接口。
      2.必须有默认的public无参数的构造方法。
      3.必须覆盖equals和hashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。只有对象的userId和roleId 值完全相同时或同一个对象时则返回true。否则返回false。hashCode方法返回当前对象的哈希码,生成的hashCode相同的概率越小越好,算法可以进行优化。
    具体代码如下
/**
 * 用户角色表的复合主键
 * @author Michael sun
 */
public class UserRolePK implements Serializable {

    public UserRolePK() {

    }

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -4901479789268752591L;

    /**
     * 用户名
     */
    private String userId;

    /**
     * 角色ID
     */
    private Integer roleId;

    /**
     * @return the userId
     */
    public String getUserId() {
        return userId;
    }

    /**
     * @return the roleId
     */
    public Integer getRoleId() {
        return roleId;
    }

    /**
     * @param pUserId the userId to set
     */
    public void setUserId(String pUserId) {
        userId = pUserId;
    }

    /**
     * @param pRoleId the roleId to set
     */
    public void setRoleId(Integer pRoleId) {
        roleId = pRoleId;
    }

    /**
     * overrides hashCode()
     * @return int
     */
    public int hashCode() {
        int result;
        result = userId.hashCode();
        result = 29 * result + roleId.hashCode();
        return result;
    }

    /**
     * overrides equals
     * @see java.lang.Object#equals(java.lang.Object)
     */

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (null == obj) {
            return false;
        }
        if (!(obj instanceof UserRolePK)) {
            return false;
        }

        final UserRolePK pko = (UserRolePK) obj;
        if (!userId.equals(pko.userId)) {
            return false;
        }
        if (null == roleId || roleId.intValue() != pko.roleId) {
            return false;
        }
        return true;
    }

}


  二、通过@IdClass注释在实体中标注复合主键,需要注意:
     1.@IdClass标注用于标注实体所使用主键规则的类
     2.在实体中同时标注主键的属性。本例中在userId和roleId的getter方法前标注@Id,表示复合主键使用这两个属性
实体代码如下。
/**
 * 用户角色关系表
 * @author Michael sun
 */
@Entity
@Table(name = "TB_USER_ROLE")
@IdClass(UserRolePK.class)
public class UserRole implements Serializable {

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -8743424029912282776L;

    /**
     * 用户名
     */
    private String userId;

    /**
     * 角色ID
     */
    private Integer roleId;

    /**
     * 创建人
     */
    private String createUser;

    /**
     * @return the userId
     */
    @Id
    @Column(name = "USER_ID", nullable = false)
    public String getUserId() {
        return userId;
    }

    /**
     * @return the roleId
     */
    @Id
    @Column(name = "ROLE_ID", nullable = false)
    public Integer getRoleId() {
        return roleId;
    }

    /**
     * @param pUserId the userId to set
     */
    public void setUserId(String pUserId) {
        userId = pUserId;
    }

    /**
     * @param pRoleId the roleId to set
     */
    public void setRoleId(Integer pRoleId) {
        roleId = pRoleId;
    }

    /**
     * @return the createUser
     */
    @Column(name = "CREATE_USER")
    public String getCreateUser() {
        return createUser;
    }

    /**
     * @param pCreateUser the createUser to set
     */
    public void setCreateUser(String pCreateUser) {
        createUser = pCreateUser;
    }

}

ps:符合主键的值一般要通过程序设置,而不是按照某一个规则自动生成的

复合主键也可以采用嵌入式主键替代,例如上面复合主键修改成嵌入式主键的步骤如下
  一、code一个嵌入式主键的类,类似于上面的复合主键的类,需要注意代码中加 @Column 注释的地方
具体代码如下:
/**
 * 用户角色表的复合主键
 * @author Michael sun
 */
public class UserRolePK implements Serializable {

    /**
     * UserRolePK
     */
    public UserRolePK() {
        super();
    }

    /**
     * @param userId
     * @param roleId
     */
    public UserRolePK(String userId, Integer roleId) {
        super();
        this.userId = userId;
        this.roleId = roleId;
    }

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -4901479789268752591L;

    /**
     * 用户名
     */
    private String userId;

    /**
     * 角色ID
     */
    private Integer roleId;

    /**
     * @return the userId
     */
    @Column(name = "USER_ID", nullable = false)
    public String getUserId() {
        return userId;
    }

    /**
     * @return the roleId
     */
    @Column(name = "ROLE_ID", nullable = false)
    public Integer getRoleId() {
        return roleId;
    }
    //其他和上面的复合主键一样
}


  二、嵌入式主键实体类的写法需要在复合主键类的get方法加注@EmbeddedId
具体代码如下
/**
 * 用户角色关系表
 * @author Michael sun
 */

@Entity
@Table(name = "TB_USER_ROLE")
public class UserRole implements Serializable {

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -8743424029912282776L;

    /**
     * 复合主键
     */
    @EmbeddedId
    private UserRolePK pk;

    /**
     * 创建人
     */
    private String createUser;

    /**
     * @return the pk
     */
    @EmbeddedId
    public UserRolePK getPk() {
        return pk;
    }

    /**
     * @param pPk the pk to set
     */
    public void setPk(UserRolePK pPk) {
        pk = pPk;
    }

    /**
     * @return the createUser
     */
    @Column(name = "CREATE_USER")
    public String getCreateUser() {
        return createUser;
    }

    /**
     * @param pCreateUser the createUser to set
     */
    public void setCreateUser(String pCreateUser) {
        createUser = pCreateUser;
    }

    /**
     * @return the String
     */
    @Transient
    public String getUserId() {
        return pk.getUserId();
    }

    /**
     * @return the mergeFlowId
     */
    @Transient
    public Integer getRoleId() {
        return pk.getRoleId();
    }

    /**
     * @param pUserId the userId to set
     */
    public void setUserId(String pUserId) {
        this.pk.setUserId(pUserId);
    }

    /**
     * @param pRoleId the roleId to set
     */
    public void setRoleId(Integer pRoleId) {
        this.pk.setRoleId(pRoleId);
    }

}


2
0
分享到:
评论
1 楼 saiyaren 2010-03-09  
总结不错,收藏了

相关推荐

    hibernate3 注释生成复合主键或者嵌入式主键的方法及实例.doc

    总结来说,使用Hibernate3的注解,我们可以更加简洁地定义复合主键和嵌入式主键,避免了XML配置文件的繁琐。这种方法使得代码更易于理解和维护,尤其是在大型项目中,注解的使用能够提高开发效率并减少出错的可能性...

    Hibernate复合主键

    "Hibernate复合主键" Hibernate复合主键是指在 Hibernate 框架中使用复合主键来唯一标识一个实体。复合主键是指由多个字段组成的主键,用于唯一标识一个实体。在本例中,我们将通过一个简单的复合主键的做关联类的...

    hibernate复合主键配置和使用

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

    hibernate复合主键的实例

    本实例将深入探讨如何在Hibernate中实现复合主键,并提供一个具体的示例来帮助理解。 一、什么是复合主键? 在数据库设计中,主键是用于唯一标识表中每一行的字段或字段组合。当一个表的主键由两个或更多个字段...

    hibernate复合主键设置

    在Hibernate的映射文件(XML方式)或者使用JPA注解(Java方式)中,需要为复合主键提供相应的配置。对于XML配置,你可能会看到类似以下的设置: ```xml <hibernate-mapping> <!-- 其他属性的映射 --> ...

    hibernate复合主键映射

    本篇文章将深入探讨Hibernate如何处理复合主键映射,并通过实例进行解析。 复合主键在数据库设计中是常见的,例如,考虑一个订单明细表,其中订单号(order_id)和商品编号(product_id)结合在一起可以唯一识别一...

    hibernate 无主键表映射

    在Java的持久化框架Hibernate中,无主键表映射是一种特殊情况,主要处理那些在数据库中没有明确单一主键的表。这种情况通常出现在那些通过多个字段共同唯一标识一条记录的复合主键(Composite Key)场景。本文将详细...

    Hibernate各种主键生成策略与配置详解

    关于Hibernate的各种主键生成策略与配置详解

    hibernate中自动生成主键的办法

    Hibernate作为一款流行的Java持久层框架,提供了多种自动生成主键的方法,以适应不同场景的需求。本文将深入探讨Hibernate中自动生成主键的几种常见策略及其应用场景。 ### 1. UUID.hex UUID(Universally Unique ...

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    hibernate映射主键生成策略native

    本文将重点介绍在Oracle数据库环境下,使用Hibernate的“native”策略来生成主键的具体方法及注意事项。 #### 二、主键生成策略概述 在Hibernate中,主键生成策略主要包括以下几种: - **identity**:由数据库...

    Hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    Hibernate中对数据库复合主键的支持.pdf

    ### Hibernate中对数据库复合主键的支持 #### 一、引言 在软件开发过程中,特别是在J2EE领域中,Hibernate作为一种流行的ORM(Object-Relational Mapping)框架被广泛使用。ORM框架的主要作用是将关系型数据库中的...

    hibernate的主键生成策略

    在Hibernate中,主键生成策略是确保实体类中的主键字段具有唯一标识的关键部分。以下是对Hibernate主键生成策略的详细说明: 1. **assigned**: 这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate...

    hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。在使用 Hibernate 进行持久化操作时,经常需要处理实体类...

    演示怎样在Hibernate中使用复合主键

    如果使用Hibernate开发legacy的数据库应用,对于数据库表中有使用字符串作为主键或者使用复合主键情况,那么对于这些情况的影射档是比较麻烦的。该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM...

    Hibernate主键生成方式

    在Java的持久化框架Hibernate中,主键生成策略是一个关键的概念,它决定了如何为数据库中的实体对象生成唯一的标识符(主键)。以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`...

Global site tag (gtag.js) - Google Analytics