`
yupengcc
  • 浏览: 132128 次
  • 性别: 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学习笔记

    001 Hibernate 简介(开源 O/R 映射框架) 002 第一个 Hibernate 示例 003 hibernate 主要接口...026 hibernate 操作树形结构 027 hibernate 查询语言(HQL) 028 hibernate 缓存(性能优化策略) 029 hibernate 抓取策略

    hibernate操作数据库笔记

    //该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...

    Hibernate 中文 html 帮助文档

    触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一...

    hibernate基础 二 关联映射 级联操作

    hibernate 的基础 常用的主键生成策略 持久化对象的三种状态 一级缓存的常用操作(save/update/saveOrUpdate/delete)一对多关联映射 级联操作

    Hibernate实战(第2版 中文高清版)

     10.1.2 Hibernate应用程序中的事务   10.1.3 使用Java Persistence的事务   10.2 控制并发访问   10.2.1 理解数据库级并发   10.2.2 乐观并发控制   10.2.3 获得额外的隔离性保证   10.3 非事务数据...

    hibernate应用[包括示例,映射,主键自增,各种查询操作方式以及配置文档以及 Annotation示例]

    hibernate应用[包括示例,映射,主键自增,各种查询操作方式以及配置文档以及Annotation示例]

    彻底解决hibernate常见难点.zip

    N关系时保存技巧、Hibernate缓存机制、Hibernate批量处理数据、Hibernate三种继承映射策略、hibernate映射体系、Hibernate主键生成策略、持久层DAO设计建议、基于xml文件的bean、使用HibernateAPI在Spring中、事务...

    Hibernate注释大全收藏

    整个层次结构中的所有父类和子类属性都映射到同一个表中,他们的实例通过一个辨别符列(discriminator)来区分。 Plane 是父类。@DiscriminatorColumn 注解定义了辨别符列。对于继承层次结构中的每个类, @...

    hibernate.zip

    初学hibernate,尝试简单实现对数据库的更删改查操作,完成对数据库单表多表及主键与外键相关映射.

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     14.5.1 在数据库中对集合排序  14.5.2 在内存中对集合排序  14.6 映射组件类型集合  14.7 小结  14.8 思考题 第15章 映射实体关联关系  15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射 ...

    最全Hibernate 参考文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

    Hibernate_Annotation关联映射

    在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+主表中的主键列名,...

    Hibernate 多数据库支持解决方案

    Hibernate多数据库支持解决方案 一、 去掉数据库级的外键关联 二、 如何动态加载.hbm.xml文件 ...五、 hibernate主键生成器(数值型主键操作方法) 六、 Oracle 转换 SQL Server 2000注意 七、 对UTF-8数据库的特殊处理

    Struts2+hibernate雇员部门操作

    实现了增删改,分页操作(数据库两张表主键要改成自动增长)

    第24次课-1 Spring与Hibernate的整合

    第24次课-1 Spring与Hibernate的整合 本节主要内容 24.1 概述 24.2 管理SessionFactory 24.3 Spring对Hibernate的简化 ...1. Spring中是怎么对Hibernate进行支持的? 2. 如何进行Spring与Hibernate的整合?

    hibernate总结

    表:材料表和产品表多对多,在数据库中有中间表即产品材料表用来存放两个表之间的关系 Java类:材料PO,产品PO,中间PO,中间PO的复合主键类(由于是两个一对多形成的多对多,所以,这里只讲一个一对多,另一个是相同...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate3.04中文文档.chm

    5.1.2. 实现一个默认的(即无参数的)构造方法(constructor) 5.1.3. 提供一个标识属性(identifier property)(可选) 5.1.4. 使用非final的类 (可选) 5.2. 实现继承(Inheritance) 5.3. 实现equals()和...

    Hibernate教程

    Hibernate参考文档 目录 前言 1. 翻译说明 2. 版权声明 1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第...

Global site tag (gtag.js) - Google Analytics