`
yupengcc
  • 浏览: 138586 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Hibernate中对无主键表的操作

阅读更多
Hibernate中对无主键表的操作

说明:

日志表(T_B_OPERLOG)中无主键,在hibernate按一般有主键的方式来改写映射文件和生成的持久层对象;
以一般有主键的方式来操作持久层对象,就可以实现Hibernate中对无主键表的操作。
改写映射文件时要注意最后从所有属性中选择一个有唯一性的属性作为一个“主键”,如:
  <id name="operdate" type="java.util.Date">
            <column name="OPERDATE" length="7" />
   </id>
operdate是日志的操作时间,这样就可以把operdate作为伪主键,其他操作与平常有主键建对象的操作一样。
至于其中的hibernate的处理机制还不了解,但这样可以实现我的处理要求了,有时间再研究实现机制。

Hibernate的映射文件: TBOperlog.hbm.xml

<?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="cn.isbn.db.model.TBOperlog" table="T_B_OPERLOG" schema="LAB1107">
               
                        <!--    
                <id name="logid" type="java.lang.String">
                        <column name="LOGID" length="20" />                       
                </id>
                -->
             <id name="operdate" type="java.util.Date">
                        <column name="OPERDATE" length="7" />
                </id>
             <property name="logid" type="java.lang.String">
                        <column name="LOGID" length="20" />                       
             </property>
       
                <property name="opertable" type="java.lang.String">
                        <column name="OPERTABLE" length="100" not-null="true" />
                </property>
                <property name="operkey" type="java.lang.String">
                        <column name="OPERKEY" length="100" not-null="true" />
                </property>
                <property name="opertype" type="java.lang.String">
                        <column name="OPERTYPE" length="10" not-null="true" />
                </property>
                <property name="operperson" type="java.lang.String">
                        <column name="OPERPERSON" length="200" not-null="true" />
                </property>
                <!--                   
                <property name="operdate" type="java.util.Date">
                        <column name="OPERDATE" length="7" />
                </property>
                -->
                <property name="operdesc" type="java.lang.String">
                        <column name="OPERDESC" length="4000" not-null="true" />
                </property>
                <property name="recordstauts" type="java.lang.String">
                        <column name="RECORDSTAUTS" length="1" />
                </property>
                <property name="field1" type="java.lang.String">
                        <column name="FIELD1" length="500" />
                </property>
                <property name="field2" type="java.lang.String">
                        <column name="FIELD2" length="500" />
                </property>
        </class>
</hibernate-mapping>

持久对象文件:TBOperlog.java
package cn.isbn.db.model;

import java.util.Date;

/**
* TBOperlog entity.
*   
* @author MyEclipse Persistence Tools
*/

public class TBOperlog implements java.io.Serializable
{

   
  // Fields

  private String logid;
  private String opertable;
  private String operkey;
  private String opertype;
  private String operperson;
  private Date operdate;
  private String operdesc;
  private String recordstauts;
  private String field1;
  private String field2;

  // Constructors


  /**
    * 无参数的构造函数,只初始化记录编号和时间
    */
  public TBOperlog()
  {
    this.recordstauts="1";
    this.operdate = new Date();
  }

  /**
    * 必填字段构造函数
    * @param opertable 操作数据表
    * @param operkey 操作主键
    * @param opertype 操作类型
    * @param operperson 操作人
    * @param operdesc 操作描述
    */
  public TBOperlog(String opertable, String operkey, String opertype,
      String operperson, String operdesc)
  {
    this.opertable = opertable;
    this.operkey = operkey;
    this.opertype = opertype;
    this.operperson = operperson;
    this.operdesc = operdesc;
    this.recordstauts="1";
    this.operdate = new Date();
  }

  /** full constructor */
  public TBOperlog(String opertable, String operkey, String opertype,
      String operperson, String operdesc,
      String field1, String field2)
  {
    this.opertable = opertable;
    this.operkey = operkey;
    this.opertype = opertype;
    this.operperson = operperson;
    this.operdate = new Date();
    this.operdesc = operdesc;
    this.recordstauts = "1";
    this.field1 = field1;
    this.field2 = field2;
  }

  // Property accessors

  public String getLogid()
  {
    return this.logid;
  }

  public void setLogid(String logid)
  {
    this.logid = logid;
  }

  public String getOpertable()
  {
    return this.opertable;
  }

  public void setOpertable(String opertable)
  {
    this.opertable = opertable;
  }

  public String getOperkey()
  {
    return this.operkey;
  }

  public void setOperkey(String operkey)
  {
    this.operkey = operkey;
  }

  public String getOpertype()
  {
    return this.opertype;
  }

  public void setOpertype(String opertype)
  {
    this.opertype = opertype;
  }

  public String getOperperson()
  {
    return this.operperson;
  }

  public void setOperperson(String operperson)
  {
    this.operperson = operperson;
  }

  public Date getOperdate()
  {
    return this.operdate;
  }

  public void setOperdate(Date operdate)
  {
    this.operdate = operdate;
  }

  public String getOperdesc()
  {
    return this.operdesc;
  }

  public void setOperdesc(String operdesc)
  {
    this.operdesc = operdesc;
  }

  public String getRecordstauts()
  {
    return this.recordstauts;
  }

  public void setRecordstauts(String recordstauts)
  {
    this.recordstauts = recordstauts;
  }

  public String getField1()
  {
    return this.field1;
  }

  public void setField1(String field1)
  {
    this.field1 = field1;
  }

  public String getField2()
  {
    return this.field2;
  }

  public void setField2(String field2)
  {
    this.field2 = field2;
  }

}

调用对象:

public boolean addLog(TBOperlog log)
  {
    // TODO Auto-generated method stub
    boolean result = false;
    String logid = getLogid(); // 得到记录编号
    if (!logid.equals(""))
    {// 如果取得记录编号
      log.setLogid(logid);
      this.save(log);
      result = true;
    }
    return result;
  }

补充:

下面是从网上找的一个解决方法,对我的处理没帮助,也许日后对对其他的处理用的着,也贴出来,作为备忘储备吧。

来自:http://www.host01.com/article/jsp/00040007/20060805215458644.htm

Db2 表:Test 只有一个测试字段:name character(10)

Hibernate的hbm文件:Test.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"   

>
<hibernate-mapping>
<class name="Test" table="test">
<composite-id name="testpk" class="Testpk" unsaved-value="any">   
    <key-property name="name" column="name" type="string"/>   
        </composite-id>   
</class>
</hibernate-mapping>

   

Test.java

   

import java.io.Serializable;

public class Test implements Serializable{

private Testpk testpk;
   
public void setTestpk(Testpk value){
    this.testpk=value;
}
   
public Testpk getTestpk(){
    return this.testpk;
}
   
}


Testpk.java

import java.io.Serializable;   

public class Testpk implements Serializable{
   
private String name;
public String getName()
{
    return this.name;
}
   
public void setName(String value){
    this.name=value;
}
   
public boolean equals(Object other) {   
            Testpk that = (Testpk) other;   
           
            return this.name.equals(that.name);   
            }   
        
            /**   
        * Returns the hash code for the key.   
        */
    
            public int hashCode() {   
           
            return (this.name.hashCode());
            
            }   

}


测试代码:

Test t=new Test();
    Testpk tpk=new Testpk();
    tpk.setName("test000000");
    t.setTestpk(tpk);
    session.save(t);

最后值得注意的是当要load的时候,不能简单的Test t=(Test)session.load(Test.class,"test000000"); 而

使用一个Testpk作为一个实体类的标识符。

所以应该这么写:

Testpk tpk=new Testpk();
tpk.setName("test000000");
Test t=(Test)session.load(Test.class,tpk);

   

环境DB2、Eclipise、Hibernate2测试成功



本文出自 “在路上” 博客,请务必保留此出处http://yuwenhu.blog.51cto.com/672091/160930
分享到:
评论

相关推荐

    hibernate 无主键表映射

    在Hibernate中,对无主键表的操作与普通实体基本相同,只是在保存和查询时需要传入整个复合主键对象。例如,创建一个新的订单: ```java OrderKey key = new OrderKey(); key.setCustomerId("123"); key.setOrderId...

    hibernate一对一主键关联映射(单项关联)

    本篇将深入探讨在Hibernate中实现一对一主键关联映射的单项关联方式。这种关联意味着两个实体类共享相同的主键,即一个实体类的一个实例对应另一个实体类的唯一实例。 首先,我们要明确一对一主键关联映射的基本...

    hibernate中自动生成主键的办法

    本文将深入探讨Hibernate中自动生成主键的几种常见策略及其应用场景。 ### 1. UUID.hex UUID(Universally Unique Identifier)是一种生成全局唯一标识符的方式,其长度为128位,通常表示为32个十六进制数字组成的...

    hibernate使用主键关联的一对一关系

    在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来实现两个实体类之间的这种一对一绑定。下面我们将深入探讨这一主题。 首先,我们需要理解一对一关系的概念。在数据库中,一对一关系意味...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    hibernate复合主键设置

    在业务代码中,创建和操作复合主键的实体对象与普通实体对象并无太大区别。只需要确保在创建新的`OrderItem`实例时,为其`id`属性提供正确的`OrderItemId`实例即可。 总结,复合主键在Hibernate中是通过`@...

    Hibernate一对一主键映射

    在Java的持久化框架Hibernate中,一对一(One-to-One)主键映射是一种常见的关联关系。这种映射方式使得两个实体类共享同一个主键,从而建立一对一的关系。在这个实例中,我们将深入探讨Hibernate一对一主键映射的...

    Hibernate一对多使用非主键关联设置

    通过这种方式,我们就可以在Hibernate中设置一对多非主键关联,使得在操作部门和员工数据时,能够方便地维护它们之间的关系。这种方法允许我们在不违反数据库设计原则的情况下,灵活地处理实体之间的关联。同时,非...

    Hibernate Annotation 共享主键一对一双向关联

    在Java的持久化框架中,Hibernate是...总之,掌握Hibernate Annotation中的共享主键一对一双向关联,能够帮助开发者更高效地进行数据库操作,提升项目的开发效率。通过深入学习和实践,可以更好地理解和利用这一特性。

    hibernate复合主键配置和使用

    然而,当我们面临复杂的数据表结构,尤其是涉及到复合主键时,如何在Hibernate中进行配置和使用就显得尤为重要。本文将深入探讨Hibernate对复合主键的支持,帮助开发者更好地理解和应用这一特性。 一、什么是复合...

    Hibernate注解映射联合主键

    在Hibernate中,有三种主要的注解方式来映射联合主键,以下是对这三种方式的详细解释: 1. **使用`@Embeddable`和`@Id`** 在这种映射方式中,联合主键的字段被放在一个单独的类中,这个类需要实现`java.io....

    Hibernate一对多主键关联映射源代码

    总之,Hibernate的一对多主键关联映射是数据库表关系在对象模型中的体现,理解和掌握这种映射方式对于Java开发者尤其重要,尤其是在进行复杂业务逻辑处理时。通过阅读和实践提供的源代码,你应该能够深入理解并运用...

    hibernate联合主键全攻略

    - 查询操作中,如果只根据联合主键的部分字段进行查询,可能会返回多条记录,因此在设计查询逻辑时需格外小心。 总的来说,Hibernate联合主键的使用为复杂的数据关系提供了强大的支持,但同时也增加了设计和编码的...

    Hibernate用UUID作为主键的Demo

    通过提供对象-关系映射,Hibernate允许开发者将数据库操作转换为对Java对象的操作,从而减少了编写SQL语句的工作量。 ### 2. 为什么选择UUID作为主键 - **全局唯一性**:UUID生成的键值在全世界范围内都是唯一的,...

    hibernate一对一主键关联映射(双项关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系映射方式,用于表示两个实体之间一对一的对应关系。本篇主要探讨的是基于主键(Primary Key)的双向关联映射,这在实际项目中非常常见...

    hibernate的联合主键怎么设置

    有了以上配置,你就可以在程序中通过 Hibernate API 来操作这个联合主键的实体类了,例如增删改查等操作。 接下来,我们讨论 `inverse` 属性的影响。`inverse` 属性用于控制在一个关联关系中,哪一方负责维护关联...

    hibernate一对一主键关联代码实现

    首先,我们需要理解一对一关联的含义:在数据库中,如果一个表的记录只能与另一个表的唯一一条记录对应,这就构成了主键关联的一对一关系。例如,一个人可能只有一个护照,那么“人”表和“护照”表之间的关系就是一...

    hibernate一对一主键关联(注解版)

    在Hibernate中,一对一的关联可以通过共享主键来实现,即两个表共用一个主键字段。 1. **注解配置**: Hibernate使用注解来声明实体类和它们之间的关系。对于一对一的主键关联,我们需要在两个实体类中都添加`@...

    hibernate映射主键生成策略native

    其中,主键生成策略是Hibernate配置中的一个重要部分,它决定了表中的主键值如何生成。本文将重点介绍在Oracle数据库环境下,使用Hibernate的“native”策略来生成主键的具体方法及注意事项。 #### 二、主键生成...

Global site tag (gtag.js) - Google Analytics