`
newleague
  • 浏览: 1509192 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

介绍Hibernate使用UserType--ClobStringType

阅读更多
    这里介绍Hibernate使用UserType,UserType就是用户自定义类型,这里的类型指的是除了Hibernate定义的那些类型之外的用户自己定义的。

     

    Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate使用UserType,包括介绍UserType就是用户自定义类型等方面。

    1、建立数据库的时候最好建立一个跟业务逻辑完全没有关系的id,这样的好处就是以后当数据量大的时候可以容易的建立索引,而且当业务逻辑变化的时候底层的数据结构不用变化很大。

    2、代码的干净是非常非常的重要的,从现在开始尽量让自己的代码写的漂亮把!因为干净的代码不仅容易维护,而且容易发现bug,在Hibernate使用UserType是很好用的。举个经典的例子:

    实现Hibernate使用UserType接口的email 类

    比如 你需要在 TUSER 表中记录一个人的 email ,单独为其建立一张数据库表是很浪费资源的,一般的方法是将TUSER 一栏 varchar 的来记录email ,多个 email 之间用 " ; "号分开,我曾经做的项目中采取的方法是:取出一个记录着多条 email 的 string然后再来用 ; 号拆开,但是这样子就有个不好,在一堆整齐的 get 方法用出来一个有 bad smell 的代码。

    有两个方法,一个是修改映射TUSER的 java 类在其中增加一个 getEmail 方法,返回一个 list ,该方法对原先的 getEmail 方法进行二次处理。第二个方法就是采用UserType 。

    UserType就是用户自定义类型,这里的类型指的是除了Hibernate定义的那些类型之外的用户自己定义的。

    一个实现Hibernate使用UserType接口的 email 类如下(里面的每个方法都是必须实现的接口方法,许多都可以复制粘贴的,不复杂):(madp:详细代码看文章结尾)

  1.  
    1. public class Email implements UserType  
    2. ...{  
    3.  
    4. // 表示本类型实例是否可变,一般是不可变  
    5. public boolean isMutable()  
    6. ...{  
    7. return false;  
    8. }  
    9.  
    10. //该类型对应的 sql 类型  
    11. public int[] sqlTypes()  
    12. ...{  
    13. return new int[]......{Types.VARCHAR};  
    14. }  
    15.  
    16. // 改类型对应的 java 类型  
    17. public Class returnedClass()  
    18. ...{  
    19. return List.class;  
    20. }  
    21.  
    22. // 完全复制的方法,由于是用户自己定义的类型
    23. //所以hibernate并不知道要如何来复制这个类,需要用户自己定义  
    24. public Object deepCopy(Object value)throws HibernateException  
    25. ...{  
    26. List source = (List)value;  
    27. List target = new ArrayList();  
    28. target.addAll(source);  
    29. return target;  
    30. }  
    31.  
    32. //equals方法,这个就不用多说了吧,肯定是要用户自定义的  
    33. public boolean equals(Object x,Object y) throws HibernateException  
    34. ...{  
    35. //这部分不写出来了,自己实现吧,这个不是我要讲的重点  
    36. }  
    37.  
    38. /** *//**//*  
    39. 这才是重头戏!nullSafeGet 和nullSafeSet 是核心所在,对数据的后期处理都在这两个方法里面  
    40. nullSafeGet 是读取的方法  
    41. owner 目前没用到过。  
    42. names 是对应的数据库列名,UserType是可以对应多个列的  
    43. */  
    44. public Object nullSafeGet(ResultSet rs,String[] names,Object owner) 
      throws HibernateException,SQLException  
    45. ...{  
    46. String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]);  
    47. if(value != null)  
    48. ...{  
    49. //把 string 拆开成 list 的代码放在这里  
    50. }  
    51. return resultList;//得到了拆开的 邮件列表  
    52. }  
    53.  
    54. /**//*  
    55. 保存的方法  
    56. index 是那个 PreparedStatement 的参数序号,一般来说不用管直接往下传  
    57. value 就是要保存的数据,在这边是一个保存着 email 列表的 List  
    58. */  
    59. public void nullSafeSet(PreparedStatement st,Object value,int index) 
      throws HibernateException,SQLException  
    60. ...{  
    61. if(value != null)  
    62. ...{  
    63. String email = assemble(value);//将 List 拼合成 String 的 Email 的方法  
    64. Hibernate.STRING.nullSafeSet(st,email,index);  
    65. }  
    66. else  
    67. ...{  
    68. Hibernate.STRING.nullSafeSet(st,value,index);  
    69. }  
    70. }  

在TUser.hbm.xml 中如此设置:

  1.  
    1. <hibernate-mapping> 
    2. <class name="entity.TUser" table="T_USER"> 
    3. </class> 
    4. ..............  
    5. <property name = "emali"column = "email"type = "mytype.Email"/> 
    6. </hibernate-mapping> 

在TUser.java中如此设置

  1.  
    1. public class TUser implement Serializable  
    2. ...{  
    3. private Integer id;  
    4. privarte Stirng name;  
    5. //看,这边的 email 可以大胆的使用 List 了  
    6. private List email;  
    7.  
    8. //下面是一些 getter 和 setter 了  

这样设置后你使用 TUser的时候要取出  email 直接 getEmail 出来的就是一个List 了,而且前台根本不知道后台干了什么,这样代码就简洁多了。

 

 

(madp:

 

看spring源代码中对hibernate的usertype的封装

 

/*
 * Copyright 2002-2005 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.orm.hibernate3.support;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import javax.transaction.TransactionManager;

import org.springframework.jdbc.support.lob.LobCreator;
import org.springframework.jdbc.support.lob.LobHandler;

/**
 * Hibernate UserType implementation for Strings that get mapped to CLOBs.
 * Retrieves the LobHandler to use from LocalSessionFactoryBean at config time.
 *
 * <p>Particularly useful for storing Strings with more than 4000 characters in an
 * Oracle database (only possible via CLOBs), in combination with OracleLobHandler.
 *
 * <p>Can also be defined in generic Hibernate mappings, as DefaultLobCreator will
 * work with most JDBC-compliant database drivers. In this case, the field type
 * does not have to be CLOB: For databases like MySQL and MS SQL Server, any
 * large enough character type will work.
 *
 * @author Juergen Hoeller
 * @since 1.2
 * @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#setLobHandler
 */
public class ClobStringType extends AbstractLobType {

 /**
  * Constructor used by Hibernate: fetches config-time LobHandler and
  * config-time JTA TransactionManager from LocalSessionFactoryBean.
  * @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#getConfigTimeLobHandler
  * @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#getConfigTimeTransactionManager
  */
 public ClobStringType() {
  super();
 }

 /**
  * Constructor used for testing: takes an explicit LobHandler
  * and an explicit JTA TransactionManager (can be <code>null</code>).
  */
 protected ClobStringType(LobHandler lobHandler, TransactionManager jtaTransactionManager) {
  super(lobHandler, jtaTransactionManager);
 }

 public int[] sqlTypes() {
  return new int[] {Types.CLOB};
 }

 public Class returnedClass() {
  return String.class;
 }

 protected Object nullSafeGetInternal(
   ResultSet rs, String[] names, Object owner, LobHandler lobHandler)
   throws SQLException {

  return lobHandler.getClobAsString(rs, names[0]);
 }

 protected void nullSafeSetInternal(
   PreparedStatement ps, int index, Object value, LobCreator lobCreator)
   throws SQLException {

  lobCreator.setClobAsString(ps, index, (String) value);
 }

}

)

 

(madp:

 

首先看一下 hibernate给我们提供的借口。UserType接口。具体的接口方法可以去看hiberate的文档或者看夏昕的深入浅出hiberate。里面都有详细的介绍。下面看一下,我们要实现该接口 需要实现的几个方法。

    1. 首先因为 数据库的 字符串映射到java端的list数据类型。所以 需要包含一个list的属性。

       private List emails;

    2. 其次需要实现 判断俩个自定义数据类型是否相等的函数。

       public boolean equals(Object x, Object y) throws HibernateException

    3.然后是在hiberate查询和更新操作时真正需要调用的方法,该方法从resultset中取出email字段,并将其解析为List类型后返回。

        public Object nullSafeGet(ResultSet rs, String[] names, Object owner) 

    4//将list类型组装成字符串后保存到email字段
      public void nullSafeSet(PreparedStatement st, Object value, int index) 

    当然,需要自己具体的实现组装list和拆开list使其成为string的方法。

    下面贴出代码:

user.hbm.xml

 view plaincopy to clipboardprint?
<?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"> 
                
<hibernate-mapping> 
  <class name="com.chenlong.usertype.tuser" table="tuser"> 
        <id name="id" type="java.lang.Integer"> 
        <column name="ID" />    
        <generator class="increment"></generator> 
        </id> 
        <property name="name" type="java.lang.String">    
             <column name="NAME" length="255" not-null="false" />    
        </property> 
        <property name="age" type="java.lang.Integer" column="age"></property> 
        <property name="email" type="com.chenlong.usertype.EmailList"> 
        <column name = "EMAIL" length="300"/> 
        </property> 
        </class> 
</hibernate-mapping> 
<?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">
             
<hibernate-mapping>
  <class name="com.chenlong.usertype.tuser" table="tuser">
     <id name="id" type="java.lang.Integer">
     <column name="ID" /> 
     <generator class="increment"></generator>
     </id>
     <property name="name" type="java.lang.String"> 
             <column name="NAME" length="255" not-null="false" /> 
        </property>
     <property name="age" type="java.lang.Integer" column="age"></property>
     <property name="email" type="com.chenlong.usertype.EmailList">
     <column name = "EMAIL" length="300"/>
     </property>
     </class>
</hibernate-mapping>

     EmailList.java

view plaincopy to clipboardprint?
package com.chenlong.usertype;  
   
import java.io.Serializable;    
 import java.sql.PreparedStatement;    
 import java.sql.ResultSet;    
 import java.sql.SQLException;    
 import java.sql.Types;    
 import java.util.ArrayList;    
 import java.util.List;    
 import java.lang.String;   
    
  import org.hibernate.HibernateException;    
  import org.hibernate.Hibernate;    
      
  /**  
   * 必须得引用java.io.Serializable,UserType是反序列化  
   * 另外,我使用的hibernate版本是3.2,UserType从2.0到3.2有很大的差异,应该多多看看官方的doc  
   *   
   * @author @家军.严重注意org.hibernate.usertype.UserType,不要自己造车呀. 
   *   
   */    
  public class EmailList implements java.io.Serializable,org.hibernate.usertype.UserType{    
      
      private List emails;  
      
      private static final String SPLITTER = ";";    
      
      private static final int[] TYPES = new int[] { Types.VARCHAR };    
      
      public int[] sqlTypes() {    
              
          return TYPES;    
      }    
      
      public Class returnedClass() {    
          // TODO Auto-generated method stub    
          return List.class;    
      }    
      
      public boolean equals(Object x, Object y) throws HibernateException {    
          if (x == y)    
              return true;    
          if (x != null && y != null) {    
              List xList = (List) x;    
              List yList = (List) y;    
              if (xList.size() != yList.size())    
                  return false;    
              for (int i = 0; i < xList.size(); i++) {    
                  String str1 = (String) xList.get(i);    
                  String str2 = (String) yList.get(i);    
                  if (!str1.equals(str2))    
                      return false;    
              }    
              return true;    
          }    
          return false;    
      }    
      
      //从resultset中取出email字段,并将其解析为List类型后返回。  
      public Object nullSafeGet(ResultSet rs, String[] names, Object owner)    
              throws HibernateException, SQLException {    
          String value = (String) Hibernate.STRING.nullSafeGet(rs, names[0]);    
          if (value != null) {    
              return parse(value);    
          } else {    
              return null;    
          }    
      }    
       
      //将list类型组装成字符串后保存到email字段  
      public void nullSafeSet(PreparedStatement st, Object value, int index)    
              throws HibernateException, SQLException {    
          System.out.println("Set method excecuted");    
          if (value != null) {    
              String str = assemble((List) value);    
              Hibernate.STRING.nullSafeSet(st, str, index);    
          } else {    
              Hibernate.STRING.nullSafeSet(st, value, index);    
          }    
      
      }    
      
      public Object deepCopy(Object value) throws HibernateException {    
          List sourcelist = (List) value;    
          List targetlist = new ArrayList();    
          targetlist.addAll(sourcelist);    
          return targetlist;    
      }    
      
      public boolean isMutable() {            
          return false;    
      }    
      
      //将list组装成一个string返回给hibernate  
      private String assemble(List emailList) {    
          StringBuffer strBuf = new StringBuffer();    
          for (int i = 0; i < emailList.size() - 1; i++) {    
              strBuf.append(emailList.get(i)).append(SPLITTER);    
          }    
          strBuf.append(emailList.get(emailList.size() - 1));    
          return strBuf.toString();    
      }    
      
      //将string拆开,放到list中  
      private List parse(String value) {    
          String[] strs = value.split(SPLITTER);  
          List emailList = new ArrayList();    
          for (int i = 0; i < strs.length; i++) {    
              emailList.add(strs[i]);    
          }    
          return emailList;    
      }    
      
      public Object assemble(Serializable arg0, Object arg1) throws HibernateException {    
          // TODO Auto-generated method stub    
          return null;    
      }    
      
      public Serializable disassemble(Object arg0) throws HibernateException {    
          // TODO Auto-generated method stub    
          return null;    
      }    
      
      public int hashCode(Object arg0) throws HibernateException {    
          // TODO Auto-generated method stub    
          return 0;    
      }    
      
      public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {    
          // TODO Auto-generated method stub    
          return null;    
      }    
      
  }   
package com.chenlong.usertype;
 
import java.io.Serializable; 
 import java.sql.PreparedStatement; 
 import java.sql.ResultSet; 
 import java.sql.SQLException; 
 import java.sql.Types; 
 import java.util.ArrayList; 
 import java.util.List; 
 import java.lang.String;
 
  import org.hibernate.HibernateException; 
  import org.hibernate.Hibernate; 
   
  /**
   * 必须得引用java.io.Serializable,UserType是反序列化
   * 另外,我使用的hibernate版本是3.2,UserType从2.0到3.2有很大的差异,应该多多看看官方的doc
   * 
   * @author @家军.严重注意org.hibernate.usertype.UserType,不要自己造车呀.
   * 
   */ 
  public class EmailList implements java.io.Serializable,org.hibernate.usertype.UserType{ 
   
      private List emails;
   
      private static final String SPLITTER = ";"; 
   
      private static final int[] TYPES = new int[] { Types.VARCHAR }; 
   
      public int[] sqlTypes() { 
           
          return TYPES; 
      } 
   
      public Class returnedClass() { 
          // TODO Auto-generated method stub 
          return List.class; 
      } 
   
      public boolean equals(Object x, Object y) throws HibernateException { 
          if (x == y) 
              return true; 
          if (x != null && y != null) { 
              List xList = (List) x; 
              List yList = (List) y; 
              if (xList.size() != yList.size()) 
                  return false; 
              for (int i = 0; i < xList.size(); i++) { 
                  String str1 = (String) xList.get(i); 
                  String str2 = (String) yList.get(i); 
                  if (!str1.equals(str2)) 
                      return false; 
              } 
              return true; 
          } 
          return false; 
      } 
   
      //从resultset中取出email字段,并将其解析为List类型后返回。
      public Object nullSafeGet(ResultSet rs, String[] names, Object owner) 
              throws HibernateException, SQLException { 
          String value = (String) Hibernate.STRING.nullSafeGet(rs, names[0]); 
          if (value != null) { 
              return parse(value); 
          } else { 
              return null; 
          } 
      } 
    
      //将list类型组装成字符串后保存到email字段
      public void nullSafeSet(PreparedStatement st, Object value, int index) 
              throws HibernateException, SQLException { 
          System.out.println("Set method excecuted"); 
          if (value != null) { 
              String str = assemble((List) value); 
              Hibernate.STRING.nullSafeSet(st, str, index); 
          } else { 
              Hibernate.STRING.nullSafeSet(st, value, index); 
          } 
   
      } 
   
      public Object deepCopy(Object value) throws HibernateException { 
          List sourcelist = (List) value; 
          List targetlist = new ArrayList(); 
          targetlist.addAll(sourcelist); 
          return targetlist; 
      } 
   
      public boolean isMutable() {         
          return false; 
      } 
   
      //将list组装成一个string返回给hibernate
      private String assemble(List emailList) { 
          StringBuffer strBuf = new StringBuffer(); 
          for (int i = 0; i < emailList.size() - 1; i++) { 
              strBuf.append(emailList.get(i)).append(SPLITTER); 
          } 
          strBuf.append(emailList.get(emailList.size() - 1)); 
          return strBuf.toString(); 
      } 
   
      //将string拆开,放到list中
      private List parse(String value) { 
          String[] strs = value.split(SPLITTER);
          List emailList = new ArrayList(); 
          for (int i = 0; i < strs.length; i++) { 
              emailList.add(strs[i]); 
          } 
          return emailList; 
      } 
   
      public Object assemble(Serializable arg0, Object arg1) throws HibernateException { 
          // TODO Auto-generated method stub 
          return null; 
      } 
   
      public Serializable disassemble(Object arg0) throws HibernateException { 
          // TODO Auto-generated method stub 
          return null; 
      } 
   
      public int hashCode(Object arg0) throws HibernateException { 
          // TODO Auto-generated method stub 
          return 0; 
      } 
   
      public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException { 
          // TODO Auto-generated method stub 
          return null; 
      } 
   
  }  

javabean--   tuser.java

view plaincopy to clipboardprint?
package com.chenlong.usertype;    
import java.util.List;    
       
   /**  
     * EchoMessageEmail generated by MyEclipse Persistence Tools  
     */    
       
public class tuser  implements java.io.Serializable {    
       
       private Integer id;    
       private String name;    
       private Integer age;  
       private List email;    
      
     /** default constructor */    
     public tuser() {    
      }    
     
     /** minimal constructor */    
      public tuser(String name) {    
          this.name = name;    
    }    
          
      /** full constructor */    
       public tuser(String name,Integer age, List email) {    
         this.name = name;    
         this.email = email;    
         this.age = age;  
      }    
     
         
     // Property accessors    
     
     public Integer getId() {    
        return this.id;    
    }    
          
     public void setId(Integer id) {    
           this.id = id;    
     }    
     
     public String getName() {    
         return this.name;    
     }    
         
     public void setName(String name) {    
        this.name = name;    
     }    
     
     public Integer getAge() {    
         return this.age;    
     }    
          
     public void setAge(Integer age) {    
           this.age = age;    
     }    
     public List getEmail() {    
        return email;    
     }    
      
      public void setEmail(List email) {    
         this.email = email;    
     }    
}  
  
package com.chenlong.usertype; 
import java.util.List; 
    
   /**
     * EchoMessageEmail generated by MyEclipse Persistence Tools
     */ 
    
public class tuser  implements java.io.Serializable { 
    
       private Integer id; 
       private String name; 
       private Integer age;
       private List email; 
   
     /** default constructor */ 
     public tuser() { 
      } 
  
     /** minimal constructor */ 
      public tuser(String name) { 
          this.name = name; 
    } 
       
      /** full constructor */ 
       public tuser(String name,Integer age, List email) { 
         this.name = name; 
         this.email = email; 
         this.age = age;
      } 
  
      
     // Property accessors 
  
     public Integer getId() { 
        return this.id; 
    } 
       
     public void setId(Integer id) { 
           this.id = id; 
     } 
  
     public String getName() { 
         return this.name; 
     } 
      
     public void setName(String name) { 
        this.name = name; 
     } 
  
     public Integer getAge() { 
         return this.age; 
     } 
       
     public void setAge(Integer age) { 
           this.age = age; 
     } 
     public List getEmail() { 
        return email; 
     } 
   
      public void setEmail(List email) { 
         this.email = email; 
     } 
}
 
 

测试类 -- HibernateTest.java

view plaincopy to clipboardprint?
package com.chenlong.usertype;  
    
import java.util.List;    
import java.util.ListIterator;    
import com.chenlong.usertype.tuser;  
import org.hibernate.Query;    
import org.hibernate.Session;    
import org.hibernate.SessionFactory;    
import org.hibernate.Transaction;  
import org.hibernate.cfg.Configuration;    
      
  public class HibernateTest {    
      
      public static void main(String[] args) throws Exception{            
          Configuration config = new Configuration().configure();  
          SessionFactory factory = config.buildSessionFactory();    
          Session session = factory.openSession();    
          Query query = session.createQuery("from tuser as a");    
          /**  
           * 理论上来说,这里不存在lazy加载,为了安全起见使用了Iterator  
           *   
           */    
          ListIterator iterator = query.list().listIterator();    
          tuser tt = (tuser) iterator.next();//只找第一个    
          List emails = tt.getEmail();     
          for (int i = 0; i < emails.size(); i++) {    
              String emailStr = (String)emails.get(i);    
              System.out.println(emailStr);    
          }     
          tuser user = (tuser) session.load(tuser.class, new Integer(2));  
          List list = user.getEmail();  
          for(int i=0;i<list.size();i++)  
          {  
              System.out.println(list.get(i));  
          }  
            
          list.remove("54beikehanmu@163.com");  
          list.remove("54beikehanmu@163.com");  
          //list.("54beikehanmu@163.com");  
          Transaction tx = session.beginTransaction();  
          session.save(user);  
          tx.commit();  
            
            
          session.close();    
      }       
  } 

 

 )

分享到:
评论
1 楼 beforezero 2011-03-10  
介紹個2級緩存與UserType看看

相关推荐

    Hibernate3.2EnumTypeMapping-demo.zip

    - `TYPE`:自定义类型映射,需要实现`org.hibernate.usertype.UserType`接口,可以自定义存储和读取的逻辑。 2. **配置枚举类型映射**: 在Hibernate的映射文件(.hbm.xml)中,可以使用`&lt;typedef&gt;`元素定义枚举...

    Hibernate-API-3.3.1-GA.chm.zip_Java编程_Java_

    9. **类型转换**:Hibernate允许自定义类型转换,通过实现`UserType`接口,可以将Java类型和数据库类型之间进行定制化的映射。 10. **实体关系映射**:Hibernate通过注解或XML配置文件来描述实体类与数据库表之间的...

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

     11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 ...

    hibernate4.1中文api

    - **使用org.hibernate.usertype.UserType**: 实现自定义用户类型。 - **使用org.hibernate.usertype.CompositeUserType**: 映射复合类型。 - **类型注册**: 注册自定义类型。 #### 7. 集合映射 - **持久化集合*...

    hibernate需要的jar包们

    在使用Hibernate时,确保正确配置并包含必要的JAR(Java Archive)文件至关重要,因为这些库提供了框架运行所需的功能。下面我们将详细探讨Hibernate所需的JAR包及其作用。 1. **hibernate-core.jar**:这是...

    hibernate存取json数据的代码分析

    标题中的“hibernate存取json数据的代码分析”指的是在Java开发中,使用Hibernate框架来存储和检索JSON格式的数据。Hibernate是一个强大的ORM(对象关系映射)框架,它允许开发者将Java对象直接映射到数据库表,但在...

    hibernate(api_介绍)

    Hibernate 是一个强大的 Java 持久化框架,它简化了数据库与对象之间的交互。通过提供一组丰富的API,Hibernate使得开发者能够在应用中轻松地管理和操作数据库数据。...理解并熟练使用这些接口是掌握Hibernate的关键。

    J2EE企业级项目开发-1期 04 Hibernate使用经验.doc

    在Hibernate中,使用`UserType`可以提升代码质量。`UserType`允许我们自定义数据类型的映射,以便更好地适应特定业务需求。 3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不...

    hibernate(api 介绍).docx

    Hibernate API 介绍 Hibernate 是一个基于 Java 的开源持久层框架,提供了对数据库的访问和操作接口。下面是 Hibernate API 的详细介绍。 核心接口 1. org.hibernate.cfg.Configuration Interface:配置并启动 ...

    马士兵hibernate学习笔记

    - **自定义数据类型**:通过实现 `org.hibernate.usertype.UserType` 接口来自定义数据类型。 通过以上内容的学习,可以全面理解 Hibernate 的基本原理和使用方法,掌握其核心概念和技术要点,从而能够有效地利用 ...

    hibernate JAR包

    12. **类型转换**:Hibernate允许用户自定义类型转换,通过实现`UserType`接口,可以处理自定义类型与数据库类型的转换。 13. **懒加载(Lazy Loading)**:通过`@OneToMany(mappedBy = "parent", fetch = ...

    用Hibernate实现领域对象的自定义字段

    本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对Hibernate核心概念的理解以及自定义类型的应用。 首先,我们需要了解Hibernate的核心概念。Hibernate主要通过配置文件(hibernate.cfg.xml)...

    Hibernate 配置跟数据库字段的对应关系

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。本文将深入探讨如何在Hibernate配置中设置与数据库字段的对应关系,以及...

    Hibernate Reference 4.3.4 zh_CN 中文版

    - **自定义类型使用org.hibernate.usertype.UserType** - **自定义类型使用org.hibernate.usertype.CompositeUserType** **6.5 类型注册表**:说明了如何注册自定义类型。 #### 7. 集合的映射 - **持久集合**:...

    hibernate_persistence第02-16章书中源码

    这部分可能详细介绍了如何在Hibernate中处理多对多关联,包括使用中间表和Set集合来管理两个实体间的关联。 8. **hibernate_07_003_MTO_SXGL_Category** 和 **hibernate_10_001_composition**: "MTO"可能表示一对...

    mysql 让hibernate支持text字段的方言

    - 如果使用的是HBM(Hibernate Mapping)文件,需要在对应字段上配置`type`属性,指向自定义的`UserType`全限定类名。 通过以上步骤,你可以确保Hibernate在处理MySQL的`TEXT`字段时能够正确地进行序列化、反序列...

    hibernate映射Oracle中LONG类型

    在 Hibernate 框架中,使用自定义类型映射 Oracle 中的 LONG 类型字段是一种常见的解决方案。通过实现 UserType 接口,我们可以定制 LONG 类型字段的读写操作。在本例中,我们定义了一个名为 CustomLong 的类,该类...

    动态添加hibernate domain的属性的例子

    本例子将详细介绍如何在Hibernate中实现这个功能。 首先,理解Hibernate Domain的概念。Domain是业务逻辑中的实体对象,它对应数据库中的表。通常,我们在创建Domain类时会定义好所有需要的属性,但有些情况下,...

    hibernate3中文手册

    4. **Session接口**:介绍Hibernate的核心组件Session,它是与数据库交互的桥梁,讲解如何创建、打开、关闭Session,以及使用Transaction管理事务。 5. **实体类和持久化对象(POJO)**:解析实体类的设计,如何...

    Hibernate4实战 之第七部分

    当需要持久化某些来自第三方库的Java类型时,如果这些类型没有提供适当的getter和setter方法,可以考虑实现`org.hibernate.UserType`接口来定义自定义类型。这样可以在不修改原有类的情况下完成持久化任务。 #### ...

Global site tag (gtag.js) - Google Analytics