`
Riddick
  • 浏览: 642378 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Hibernate复合主键

阅读更多


HIbernate有两种方法来处理复合主键,第一种是基于实体类属性的复合主键,另一种是基于主键类的复合主键。在这里使用基于主键类的复合主键。
通常将复合主键相关属性,单独抽取出来,建立一个独立的类,这个类就是主键类,要求:
  * 必须实现序列化(Serializable)接口
  * 必须重写equals和hashcode方法
 
  复合主键的值是一个主键类,而不是一个普通的常见数值,因此,复合主键在映射文件中采用<composite-id>标签进行标识,其它属性采用<property>正常映射。

 

 建立一个主键类Timestamp,代码如下:

public class Timestamp implements Serializable{

   private String date;
   private String time;

   public String getDate() {
      return date;
   }

   public void setDate(String date) {
      this.date = date;
   }

   public String getTime() {
      return time;
   }

   public void setTime(String time) {
      this.time = time
   }

   //重写equals方法
   public boolean equals(Object other) {
      if(this == other) {
         return true;
      }
      if(other == null) {
         return false;
      }
      if(!(other instanceof Timestamp)) {
         return false;
      }
      
      Timestamp castOther = (Timestamp)other;

      //根据业务需要,设定比较条件
    return ((this.getDate() == castOther.getDate()) 
                  ||  (this.getDate() != null && castOther.getDate() != null
                  && this.getDate().equals(castOther.getDate())))
                   
                  && ((this.getTime() == castOther.getTime())
                  || (this.getTime() != null && castOther.getTime() !=null
                  && this.getTime().equals(castOther.getTime())));
  }

   //重写hashCode()方法
   public int hashCode() {
      int result = 17;

      result = 37 * result + 
                     (getDate() == null ? 0 : this.getDate().hashCode());
       
      result = 37 * result + 
                     (getTime() == null ? 0 : this.getTime().hashCode());

      return result;
   }
}

 

建立以主键类Timestamp为其中一个属性的bean类,代码如下:

public class Message implements Serializable {
   private Timestamp timestamp;
   private String messageId;
   private String messageContent;

   public Timestamp getTimestamp() {
      return timestamp;
   }

   public void setTimestamp(Timestamp timestamp) {
      this.timestamp = timestamp;
   }

   public String getMessageId() {
      return messageId;
   }

   public void setMessageId(String messageId) {
      this.messageId = messageId;
   }

   public String getMessageContent() {
       return messageContent;
   }

   public void setMessageContent(String messageContent) {
       this.messageContent = messageContent;
   } 
}

 

建立映射文件Message.hbm.xml,并在hibernate.cfg.xml文件中加入该映射文件,Message.hbm.xml文件内容如下:

<?xml version="1.0"?>   
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
<hibernate-mapping>   
    <class name="com.iprai.hibernate.Message" table="message">   
        <composite-id name="timestamp">   
            <key-property name="date" column="idate"/>   
            <key-property name="time" column="itime"/>   
        </composite-id>   
        <property name="messageId" column="message_id"/>   
        <property name="messageContent" column="message_content"/>  
    </class>   
</hibernate-mapping> 

 

编写JUnit测试代码如下:

import java.util.Date;   
  
import org.hibernate.Session;   
  
import junit.framework.TestCase;   
  
public class MessageTest extends TestCase {   
       
    public void testSave() {   
        Session session = null;   
        try {   
            session = HibernateUtils.getSession();   
            session.beginTransaction();   
               
            //复合主键   
        Timestamp timestamp = new Timestamp();   
            timestamp.setDate("2009-12-05");   
            timestamp.setTime("17:01:23");   
               
            Message message = new Message();
            //和主键建立关联
        message.setTimestamp(message);   
            message.setMessageId("01");   
            message.setMessageContent("JavaEye");
               
            session.save(message);
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();   
        }finally {
            HibernateUtils.closeSession(session);   
        }   
    }   
       
    public void testLoad() {   
        Session session = null;   
        try {   
            session = HibernateUtils.getSession();  
        //复合主键   
        Timestamp timestamp = new Timestamp();   
            timestamp.setDate("2009-12-05");   
            timestamp.setTime("17:01:23");   

            Message message = (Message)session.load(Message.class, timestamp);   
            System.out.println("MessageId=" + message.getMessageId());   
            System.out.println("MessageContent=" + message.getMessageContent());   
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            HibernateUtils.closeSession(session);   
        }   
    }
}  

 

分享到:
评论

相关推荐

    hibernate复合主键配置和使用

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

    hibernate复合主键映射

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

    hibernate复合主键设置

    在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据结构,用于处理具有多个字段作为唯一标识的情况。本教程将深入探讨如何在Hibernate中设置复合主键,并提供一个可直接使用的配置示例。 ...

    Hibernate复合主键视频2

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

    Hibernate复合主键3

    更名为 Hibernate复合主键.part3.rar

    hibernate复合主键的实例

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

    Hibernate复合主键.

    本篇文章将深入探讨Hibernate如何支持和管理复合主键。 一、理解复合主键 在数据库设计中,复合主键是一种特殊情况,当单个字段不能唯一标识表中的每一行时,可以使用两个或多个字段的组合来创建唯一的标识。例如...

    Hibernate复合主键part1

    本章讲解Hibernate中对数据库复合主键的支持

    hibernate 无主键表映射

    通过以上的解释,我们可以看到,虽然无主键表在数据库中并不常见,但在某些特定场景下,如复合主键,Hibernate提供了一套完整的解决方案。所提供的资源包括一个简单的Demo,可以实际运行并理解无主键表映射的实现...

    hibernate复合主键及关联的实现

    博文链接:https://balaschen.iteye.com/blog/155127

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

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

    Hibernate学习笔记

    复合主键关联映射则是处理具有多个字段作为主键的表与对象之间的映射。 通过理解这些知识点,开发者可以更有效地利用Hibernate框架来开发复杂的企业级应用,处理数据持久化以及对象和关系数据库之间的映射。...

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

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

Global site tag (gtag.js) - Google Analytics