- 浏览: 1508861 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (798)
- struts2 (42)
- servlet (20)
- quartz (4)
- jquery & ajax (24)
- tomcat (5)
- javascript (15)
- struts1 (8)
- 搜索关键字及链接 (3)
- fckeditor (3)
- Apache (5)
- spring (22)
- linux (3)
- 企业应用 (8)
- 综合应用 (13)
- 服务器 (2)
- 数据库 (85)
- 性能调优 (21)
- 网络应用 (15)
- 缓存技术 (8)
- 设计模式 (39)
- 面试题 (7)
- 程序人生&前辈程序员 (29)
- java基础 (59)
- hibernate (75)
- log4j (4)
- http (11)
- 架构设计 (28)
- 网页设计 (12)
- java邮件 (4)
- 相关工具 (11)
- ognl (7)
- 工作笔记 (18)
- 知识面扩展 (12)
- oracle异常 (1)
- 正则表达式 (2)
- java异常 (5)
- 项目实践&管理 (1)
- 专业术语 (11)
- 网站参考 (1)
- 论坛话题 (2)
- web应用 (11)
- cxf&webservice (22)
- freemarker (3)
- 开源项目 (9)
- eos (1)
- ibatis (6)
- 自定义标签 (3)
- jsp (3)
- 内部非公开文档(注意:保存为草稿) (0)
- 国内外知名企业 (2)
- 网店 (3)
- 分页 (1)
- 消费者习惯 (2)
- 每日关注 (1)
- 商业信息 (18)
- 关注商业网站 (1)
- 生活常识 (3)
- 新闻 (2)
- xml&JSON (5)
- solaris (1)
- apache.common (3)
- BLOB/CLOB (1)
- lucene (2)
- JMS (14)
- 社会进程 (8)
- SSH扩展 (2)
- 消费心理 (1)
- 珠三角 (1)
- 设计文档 (1)
- XWork&webwork (1)
- 软件工程 (3)
- 数据库及链接 (1)
- RMI (2)
- 国内外知名企业&人物 (1)
最新评论
-
司c马:
简介易懂、
OutputStream和InputStream的区别 -
在世界的中心呼喚愛:
解决我的问题
Java获取客户端的真实IP地址 -
bo_hai:
都是些基本的概念呀!
SSO -
tian_4238:
哥们,你也是搞水利这块的吧。
巧用SQLQuery中的addScalar -
loveEVERYday:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结
-
这里介绍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:详细代码看文章结尾)
-
- public class Email implements UserType
- ...{
- // 表示本类型实例是否可变,一般是不可变
- public boolean isMutable()
- ...{
- return false;
- }
- //该类型对应的 sql 类型
- public int[] sqlTypes()
- ...{
- return new int[]......{Types.VARCHAR};
- }
- // 改类型对应的 java 类型
- public Class returnedClass()
- ...{
- return List.class;
- }
- // 完全复制的方法,由于是用户自己定义的类型
- //所以hibernate并不知道要如何来复制这个类,需要用户自己定义
- public Object deepCopy(Object value)throws HibernateException
- ...{
- List source = (List)value;
- List target = new ArrayList();
- target.addAll(source);
- return target;
- }
- //equals方法,这个就不用多说了吧,肯定是要用户自定义的
- public boolean equals(Object x,Object y) throws HibernateException
- ...{
- //这部分不写出来了,自己实现吧,这个不是我要讲的重点
- }
- /** *//**//*
- 这才是重头戏!nullSafeGet 和nullSafeSet 是核心所在,对数据的后期处理都在这两个方法里面
- nullSafeGet 是读取的方法
- owner 目前没用到过。
- names 是对应的数据库列名,UserType是可以对应多个列的
- */
- public Object nullSafeGet(ResultSet rs,String[] names,Object owner)
throws HibernateException,SQLException - ...{
- String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]);
- if(value != null)
- ...{
- //把 string 拆开成 list 的代码放在这里
- }
- return resultList;//得到了拆开的 邮件列表
- }
- /**//*
- 保存的方法
- index 是那个 PreparedStatement 的参数序号,一般来说不用管直接往下传
- value 就是要保存的数据,在这边是一个保存着 email 列表的 List
- */
- public void nullSafeSet(PreparedStatement st,Object value,int index)
throws HibernateException,SQLException - ...{
- if(value != null)
- ...{
- String email = assemble(value);//将 List 拼合成 String 的 Email 的方法
- Hibernate.STRING.nullSafeSet(st,email,index);
- }
- else
- ...{
- Hibernate.STRING.nullSafeSet(st,value,index);
- }
- }
-
}
在TUser.hbm.xml 中如此设置:
-
- <hibernate-mapping>
- <class name="entity.TUser" table="T_USER">
- </class>
- ..............
- <property name = "emali"column = "email"type = "mytype.Email"/>
- </hibernate-mapping>
在TUser.java中如此设置
-
- public class TUser implement Serializable
- ...{
- private Integer id;
- privarte Stirng name;
- //看,这边的 email 可以大胆的使用 List 了
- private List email;
- //下面是一些 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();
}
}
)
发表评论
-
自定义用户类(UserType)的使用
2011-08-04 10:46 1881学习hibernate有段时间了,最近复习这门技术时看到了自定 ... -
技巧:利于ThreadLocal模式管理Session
2011-08-02 10:31 1271在利用Hibernate开发DAO模块时,我们和Session ... -
Hibernate中的回调与拦截机制
2011-07-27 17:31 1466在某些情况下,我们需要对实体的CURD操作进行捕获并执行一些操 ... -
HibernateTemplate中HibernateCallback的事务
2011-07-04 14:41 1455目的:使用HibernateTemplate执行execute ... -
Hibernate的复杂用法HibernateCallback
2011-07-04 14:40 1345HibernateTemplate还提供一种更加灵活的方式来操 ... -
Hibernate session FlushMode有五种属性
2011-07-04 13:59 17371、NEVER:已经废弃了,被MANUAL取代了2 MANUA ... -
数据库持久层——浅谈hibernate中的Session
2011-07-01 22:49 1680大多数情况下,Session 管理的目标聚焦于通过合理的设 ... -
详解Hibernate Session
2011-07-01 22:42 1502这里介绍Hibernate Session,Ses ... -
HttpSession与Hibernate中Session的区别
2011-07-01 22:41 1304一、javax.servlet.http.HttpSess ... -
巧用SQLQuery中的addScalar
2011-06-02 17:16 5755当我们用HQL进行子查询的时候,如select * from ... -
hibernate中SQLQuery的addEntity();方法
2011-04-13 14:48 2897如果使用原生sql语句进行query查询时,hibernate ... -
Hibernate的clear(),flush(),evict()方法详解
2011-03-24 11:18 17781.Clear 方法 无论是Load 还是 G ... -
hibernate模糊查询-Restrictions.ilike & Expression.like
2011-03-11 10:32 16369Criteria criteria = session.c ... -
Hibernate分页查询小结
2011-03-10 11:14 1834通常使用的Hibernate通常是三种:hql查询,QBC查询 ... -
current_session_context_class
2011-03-07 15:31 1300此设置的作用如下: What does sessionFac ... -
Hibernate的拦截器和监听器
2010-12-14 15:06 1392核心提示:最近项目需要,用到了Hibernate的拦截器和 ... -
孙卫琴.精通Hibernate:Java对象持久化技术详解_触发器使缓存与数据库不一致
2010-12-14 08:46 1404p198 -
孙卫琴.精通Hibernate:Java对象持久化技术详解_优化报表查询的性能
2010-12-13 17:51 1281p332 -
孙卫琴.精通Hibernate:Java对象持久化技术详解_查询结果类型
2010-12-13 17:34 1309p329 -
孙卫琴.精通Hibernate:Java对象持久化技术详解_投影查询
2010-12-13 17:31 1430p325
相关推荐
- `TYPE`:自定义类型映射,需要实现`org.hibernate.usertype.UserType`接口,可以自定义存储和读取的逻辑。 2. **配置枚举类型映射**: 在Hibernate的映射文件(.hbm.xml)中,可以使用`<typedef>`元素定义枚举...
9. **类型转换**:Hibernate允许自定义类型转换,通过实现`UserType`接口,可以将Java类型和数据库类型之间进行定制化的映射。 10. **实体关系映射**:Hibernate通过注解或XML配置文件来描述实体类与数据库表之间的...
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
- **使用org.hibernate.usertype.UserType**: 实现自定义用户类型。 - **使用org.hibernate.usertype.CompositeUserType**: 映射复合类型。 - **类型注册**: 注册自定义类型。 #### 7. 集合映射 - **持久化集合*...
在使用Hibernate时,确保正确配置并包含必要的JAR(Java Archive)文件至关重要,因为这些库提供了框架运行所需的功能。下面我们将详细探讨Hibernate所需的JAR包及其作用。 1. **hibernate-core.jar**:这是...
标题中的“hibernate存取json数据的代码分析”指的是在Java开发中,使用Hibernate框架来存储和检索JSON格式的数据。Hibernate是一个强大的ORM(对象关系映射)框架,它允许开发者将Java对象直接映射到数据库表,但在...
Hibernate 是一个强大的 Java 持久化框架,它简化了数据库与对象之间的交互。通过提供一组丰富的API,Hibernate使得开发者能够在应用中轻松地管理和操作数据库数据。...理解并熟练使用这些接口是掌握Hibernate的关键。
在Hibernate中,使用`UserType`可以提升代码质量。`UserType`允许我们自定义数据类型的映射,以便更好地适应特定业务需求。 3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不...
Hibernate API 介绍 Hibernate 是一个基于 Java 的开源持久层框架,提供了对数据库的访问和操作接口。下面是 Hibernate API 的详细介绍。 核心接口 1. org.hibernate.cfg.Configuration Interface:配置并启动 ...
- **自定义数据类型**:通过实现 `org.hibernate.usertype.UserType` 接口来自定义数据类型。 通过以上内容的学习,可以全面理解 Hibernate 的基本原理和使用方法,掌握其核心概念和技术要点,从而能够有效地利用 ...
12. **类型转换**:Hibernate允许用户自定义类型转换,通过实现`UserType`接口,可以处理自定义类型与数据库类型的转换。 13. **懒加载(Lazy Loading)**:通过`@OneToMany(mappedBy = "parent", fetch = ...
本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对Hibernate核心概念的理解以及自定义类型的应用。 首先,我们需要了解Hibernate的核心概念。Hibernate主要通过配置文件(hibernate.cfg.xml)...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。本文将深入探讨如何在Hibernate配置中设置与数据库字段的对应关系,以及...
- **自定义类型使用org.hibernate.usertype.UserType** - **自定义类型使用org.hibernate.usertype.CompositeUserType** **6.5 类型注册表**:说明了如何注册自定义类型。 #### 7. 集合的映射 - **持久集合**:...
这部分可能详细介绍了如何在Hibernate中处理多对多关联,包括使用中间表和Set集合来管理两个实体间的关联。 8. **hibernate_07_003_MTO_SXGL_Category** 和 **hibernate_10_001_composition**: "MTO"可能表示一对...
- 如果使用的是HBM(Hibernate Mapping)文件,需要在对应字段上配置`type`属性,指向自定义的`UserType`全限定类名。 通过以上步骤,你可以确保Hibernate在处理MySQL的`TEXT`字段时能够正确地进行序列化、反序列...
在 Hibernate 框架中,使用自定义类型映射 Oracle 中的 LONG 类型字段是一种常见的解决方案。通过实现 UserType 接口,我们可以定制 LONG 类型字段的读写操作。在本例中,我们定义了一个名为 CustomLong 的类,该类...
本例子将详细介绍如何在Hibernate中实现这个功能。 首先,理解Hibernate Domain的概念。Domain是业务逻辑中的实体对象,它对应数据库中的表。通常,我们在创建Domain类时会定义好所有需要的属性,但有些情况下,...
4. **Session接口**:介绍Hibernate的核心组件Session,它是与数据库交互的桥梁,讲解如何创建、打开、关闭Session,以及使用Transaction管理事务。 5. **实体类和持久化对象(POJO)**:解析实体类的设计,如何...
当需要持久化某些来自第三方库的Java类型时,如果这些类型没有提供适当的getter和setter方法,可以考虑实现`org.hibernate.UserType`接口来定义自定义类型。这样可以在不修改原有类的情况下完成持久化任务。 #### ...