`
zisefeiniao
  • 浏览: 171267 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多
如果数据库中表使用了复合主键,应该怎样映射?

需要使用一个类来描述主键信息



1、建立表
DROP TABLE user_course ;



CREATE TABLE user_course (

    userid            varchar(20)          ,

    cid               int               ,

    status            int               ,

    primary key (userid,cid)

);




2、生成表映射


如果使用了复合主键,则该表生成映射时可以不选择主键生成方式,会自动按照复合主键处理。生成出现了两个类,一个为对应表的pojo类,另一个为UserCourseId类用来描述UserCourse的主键,主键有两个,因此在UserCourseId中包含userid和cid属性。

由于按ID查询时,需要传入一个可以序列化的id值,因此id类必须实现序列化接口

注意:主键类中覆写了equals与hashCode方法,用来判断主键是否重复。

package org.liky.pojo;







public class UserCourse implements java.io.Serializable {



    // Fields



    private UserCourseId id;



    private Integer status;



    // Constructors



  

    public UserCourse() {

    }



  

    public UserCourse(UserCourseId id) {

       this.id = id;

    }



  

    public UserCourse(UserCourseId id, Integer status) {

       this.id = id;

       this.status = status;

    }



    // Property accessors



    public UserCourseId getId() {

       return this.id;

    }



    public void setId(UserCourseId id) {

       this.id = id;

    }



    public Integer getStatus() {

       return this.status;

    }



    public void setStatus(Integer status) {

       this.status = status;

    }



}

package org.liky.pojo;







public class UserCourseId implements java.io.Serializable {



    // Fields



    private String userid;



    private Integer cid;



    // Constructors



  

    public UserCourseId() {

    }



  

    public UserCourseId(String userid, Integer cid) {

       this.userid = userid;

       this.cid = cid;

    }



    // Property accessors



    public String getUserid() {

       return this.userid;

    }



    public void setUserid(String userid) {

       this.userid = userid;

    }



    public Integer getCid() {

       return this.cid;

    }



    public void setCid(Integer cid) {

       this.cid = cid;

    }



    public boolean equals(Object other) {

       if ((this == other))

           return true;

       if ((other == null))

           return false;

       if (!(other instanceof UserCourseId))

           return false;

       UserCourseId castOther = (UserCourseId) other;



       if (this.getUserid() != null

              && this.userid.equals(castOther.getUserid())) {

           if (this.cid != null && this.cid.equals(castOther.getCid())) {

              return true;

           } else {

              return false;

           }

       } else {

           return false;

       }

    }



    public int hashCode() {

       int result = 17;



       result = 37 * result

              + (getUserid() == null ? 0 : this.getUserid().hashCode());

       result = 37 * result

              + (getCid() == null ? 0 : this.getCid().hashCode());

       return result;

    }



}




3、查看映射文件
在映射文件中,会通过composite-id对主键属性进行配置,语法与之前的实体映射类似

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="org.liky.pojo.UserCourse" table="user_course" catalog="testdb">

    <!-- 表示UserCourse类中id属性为复合主键值,类型为UserCourseId -->

        <composite-id name="id" class="org.liky.pojo.UserCourseId">

        <!-- 其中的userid属性与userid字段对应 -->

            <key-property name="userid" type="java.lang.String">

                <column name="userid" length="20" />

            </key-property>

            <key-property name="cid" type="java.lang.Integer">

                <column name="cid" />

            </key-property>

        </composite-id>

        <property name="status" type="java.lang.Integer">

            <column name="status" />

        </property>

    </class>

</hibernate-mapping>






4、测试
    public static void main(String[] args) {

       UserCourseDAO ucdao = DAOFactory.getTestDAOInstance();

     

       UserCourse uc = new UserCourse();

       uc.setStatus(1);

       uc.setId(new UserCourseId());

       uc.getId().setCid(1);

       uc.getId().setUserid("123456789123456789");

     

       try {

           ucdao.doCreate(uc);

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }    

    }



分享到:
评论

相关推荐

    hibernate复合主键映射

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

    Java的Hibernate框架中复合主键映射的创建和使用教程

    在Java的Hibernate框架中,复合主键映射是一种处理多列组合成主键的情况,它使得在数据库表中由两个或更多个字段组成的主键能够被正确地映射到实体类。在使用复合主键时,我们需要遵循一定的步骤和规则。 首先,...

    hibernate 无主键表映射

    在无主键表映射的情况下,数据库中的表应该没有明确的`PRIMARY KEY`约束,而是依赖于复合主键字段的唯一性。例如: ```sql CREATE TABLE Orders ( customerId VARCHAR(255) NOT NULL, orderId VARCHAR(255) NOT ...

    hibernate复合主键配置和使用

    3. 在使用复合主键时,要注意避免在多对一或一对多关系中直接使用复合主键作为外键,这可能导致映射问题。 总结,Hibernate对复合主键的处理为开发者提供了灵活性,使得处理复杂数据模型变得更加便捷。通过正确配置...

    Hibernate关联映射

    复合主键映射通常用于当一个实体的主键不是单一字段,而是由两个或更多个属性组合而成的情况。在给定的例子中,`User`类的主键由`firstName`和`lastName`两个属性共同构成,这在现实世界中可能对应于人的全名,而不...

    hibernate复合主键设置

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

    hibernate复合主键的实例

    在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据结构,用于处理具有多个字段作为唯一标识的情况。本实例将深入探讨如何在Hibernate中实现复合主键,并提供一个具体的示例来帮助理解。 ...

    hibernat非常有用的学习文档

    在上述文档中,主要讨论了 Hibernate 中的组件(Component)映射、复合主键映射以及悲观锁和乐观锁的概念。 1. **组件(Component)映射**: Component 在 Hibernate 中表示实体对象的一个逻辑组成部分,它没有...

    Hibernate复合主键.

    然而,对于复合主键,一般不推荐使用自增策略,因为复合主键通常由业务数据决定,而不是自动递增。 四、复合主键的持久化操作 在进行增删改查操作时,由于复合主键的存在,我们需要确保所有关联的主键值都被正确...

    hibernate知识复习二:组合映射

    2. **复合主键映射**:使用`@Embeddable`和`@EmbeddedId`注解,定义一个包含多个字段的复合主键类,这个类作为子对象的一部分,存储在父对象的表中。 3. **一对一嵌入映射**:使用`@OneToOne`配合`@MapsId`和`@...

    Hibernate 相关映射关系

    5. **复合主键映射(Composite Key)** 当表的主键由多个字段组成时,需要使用复合主键。在Hibernate中,可以使用`@EmbeddedId`和`@Embeddable`注解来实现。例如,一个订单由订单号和产品ID共同构成主键。 6. **...

    Hibernate复合主键

    本文详细介绍了如何在Hibernate中实现复合主键,包括复合主键类的定义、Hibernate映射文件的配置以及实体类的设计。通过这种方式,我们可以有效地利用复合主键来保证数据的唯一性和完整性。此外,还提供了一个简单的...

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

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

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

    通过这种方式,Hibernate将知道如何处理`UserRole`类,将其映射到具有复合主键的数据库表。 3. 嵌入式主键(Embedded Id): 如果希望将主键字段作为实体类的一部分,而不是单独的类,可以使用`@EmbeddedId`和`@...

    hibernate_reference_anotation 3.5.0-final pdf

    - **组合主键到复合主键映射**:当需要将一个实体的主键映射到另一个实体的复合主键时,可以使用 `@MapsId` 注解。 - **次级表映射**:对于需要存储额外信息的情况,可以使用 `@SecondaryTable` 注解来定义次级表。 ...

    HIbernate PPT

    5. **5复合主键映射和集合映射.ppt**:这部分可能涉及到如何处理复杂的主键结构,以及如何映射和操作集合类型的属性,如List、Set等。 6. **6数据关联.ppt**:讨论了如何在Hibernate中处理对象间的关联,包括外键...

    美国硅谷SVSE软件工程教育Hibernate-Lesson2

    - **复合主键映射**:当需要多个字段共同构成主键时,可以使用`&lt;composite-id&gt;`标签。 4. **数据操作与事务处理**: - **数据保存**:使用`save()`方法将对象持久化到数据库。 - **数据删除**:使用`delete()`...

Global site tag (gtag.js) - Google Analytics