Hibernate允许我们自定义映射属性的类型,比如一个学生有联系地址,而联系地址又分为家庭地址和工作地址,我们可以把两个地址信息抽象成一个新的Address类,作为Student的成员变量
数据库结构:
create table typestu (id varchar(32) primary key,name varchar(32),homeaddr varchar(32),workaddr varchar(32)); Hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312&useUnicode=true
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="myeclipse.connection.profile">mysql</property>
<property name="connection.password">1234</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.show_sql">true</property>
<property name="current_session_context_class">thread</property>
<mapping resource="Search/UserType/Student.hbm.xml" />
</session-factory>
</hibernate-configuration> Pojo
package Search.UserType;
public class Student ...{
private String id; //标识id
private String name; //学生姓名
private AddressType address;//地址
public String getId() ...{
return id;
}
public void setId(String id) ...{
this.id = id;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
public AddressType getAddress() ...{
return address;
}
public void setAddress(AddressType address) ...{
this.address = address;
}
}
自定义类型
package Search.UserType;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
public class AddressType implements UserType, Serializable ...{
private String homeAddr;
private String workAddr;
/**//* 有几个字段就有几个值,这里容易出错,要多注意 */
private static final int[] SQL_TYPES = ...{ Types.VARCHAR, Types.VARCHAR };
/**//* 这个方法告诉Hibernate在成生DDL时对列采用什么样的SQL语法 */
public int[] sqlTypes() ...{
return SQL_TYPES;
}
/**//*
* Hibernate返回什么样的映射类型,与 <property name="address" type="model.AddressType">
* 指定的类一致。事实上也可以把AddressType拆分为两个类,一个类是只携带信息的JavaBean,它里面
* 没有逻辑操作也没有实现UserType(比如AddressBean);而另一个类实现了UserType,它所面对的就不是现在这个
* AddressType类的homeAddr和homeAddr属性,它面对的是AddressBean。在本例中为了简洁方便,只用了一个类。
*/
public Class returnedClass() ...{
return AddressType.class;
}
/**//*
* 表明这个类的实例在创建以后就不可以改变属性。Hibernate能为不可改变的类作一些性能优化。
*/
public boolean isMutable() ...{
return false;
}
/**//*
* 由于AddressType是不可变的,所以深拷贝可以直接返回对象引用。拷贝的对象由应用程序使用, 而原版对象由Hibernate维护以做脏数据检查
*/
public Object deepCopy(Object value) ...{
return value; // Address is immutable
}
/**//* 两个对象是否相等,使用了apache的common工具包来进行属性比对 */
public boolean equals(Object x, Object y) ...{
if (x == y)
return true;
if (x == null || y == null)
return false;
AddressType add1 = (AddressType) x;
AddressType add2 = (AddressType) y;
return new EqualsBuilder() //使用EqualsBuilder类来方便地进行比对
.append(add1.getHomeAddr(), add2.getHomeAddr()).append(
add2.getWorkAddr(), add2.getWorkAddr()).isEquals();
}
/**//* 得到hash码 */
public int hashCode(Object x) throws HibernateException ...{
AddressType address = (AddressType) x;
return new HashCodeBuilder()//使用HashCodeBuilder类来方便地进行比对
.append(address.getHomeAddr()).append(address.getWorkAddr())
.toHashCode();
}
/**//* 读取数据并组装成一个AddressType对象。names[]中的参数顺序依照映射文件中定义的顺序 */
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws HibernateException, SQLException ...{
if (rs.wasNull())
return null;
String homeAddr = rs.getString(names[0]);
String schoolAddr = rs.getString(names[1]);
AddressType address =
分享到:
相关推荐
使用自定义类型时,你需要在实体类的属性上使用`@Type`注解,指定自定义类型的实现类,使得Hibernate在操作这些属性时能够调用我们定义的转换逻辑。 例如,如果你有一个自定义日期时间类型,可以这样使用: ```java...
本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对Hibernate核心概念的理解以及自定义类型的应用。 首先,我们需要了解Hibernate的核心概念。Hibernate主要通过配置文件(hibernate.cfg.xml)...
使用自定义类型映射 Oracle 中的 LONG 类型字段是解决 Hibernate 框架中 LONG 类型字段读写问题的一种有效方法。通过实现 UserType 接口,我们可以定制 LONG 类型字段的读写操作,并提高 Hibernate 框架的灵活性和可...
例如,可以创建一个自定义的`UserType`实现,覆盖`sqlTypes()`方法,返回`TEXT`字段对应的SQL类型代码(如` Types.LONGVARCHAR`),并在`returnedClass()`方法中指定返回的Java类型(如`String`)。 3. **配置...
- `TYPE`:自定义类型映射,需要实现`org.hibernate.usertype.UserType`接口,可以自定义存储和读取的逻辑。 2. **配置枚举类型映射**: 在Hibernate的映射文件(.hbm.xml)中,可以使用`<typedef>`元素定义枚举...
4. **Hibernate自定义类型** Hibernate允许开发者自定义数据类型,将复杂对象如集合转化为字符串存储。这通常涉及到实现`UserType`接口,覆盖其中的方法如`sqlTypes()`、`returnedClass()`等。自定义类型可以用于...
- **使用org.hibernate.usertype.UserType**: 实现自定义用户类型。 - **使用org.hibernate.usertype.CompositeUserType**: 映射复合类型。 - **类型注册**: 注册自定义类型。 #### 7. 集合映射 - **持久化集合*...
为了更精确地控制 `char` 类型的处理方式,可以考虑使用 Hibernate 提供的自定义类型,比如 `CharacterType` 或者自定义实现 `org.hibernate.usertype.UserType` 接口来创建自定义的类型转换器。 ##### 3. 参数绑定...
本文将深入探讨Hibernate对JSON的支持,特别是如何构建自定义的JSON用户类型,以便于在Hibernate中存储和查询JSON数据。 首先,让我们了解JSON在现代应用中的角色。JSON(JavaScript Object Notation)是一种轻量级...
这通常通过实现`org.hibernate.usertype.UserType`接口来完成,该接口定义了将Java类型转换为数据库类型的逻辑。 以下是一些关键步骤: 1. **创建动态扩展的基类**:定义一个基类,它继承自Hibernate的`...
本文将详细介绍如何在Hibernate中实现枚举类型到数据库的映射,包括对应的枚举类的定义、自定义UserType以及在映射文件hbm.xml中的配置。 首先,定义一个枚举类型Gender,它包含了性别相关的几个枚举值,分别是...
《Hibernate3中文手册》是Java开发领域中关于对象关系映射框架Hibernate的重要参考资料,它详尽地阐述了Hibernate3的使用方法和核心概念。Hibernate是一个开放源代码的对象关系映射框架,它允许开发者将数据库操作与...
7. **类型转换**:`UserType`和`CompositeUserType`接口允许自定义Java类型与数据库类型的转换。 8. **元数据获取**:`ClassMetadata`和`SessionFactoryMetadata`等接口提供了获取关于实体类和整个SessionFactory的...
3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不想为每个邮箱创建单独的记录,可以使用`UserType`将多个邮箱地址存储在一个`VARCHAR`字段内,以分号分隔。自定义的`Email`类...
当需要持久化某些来自第三方库的Java类型时,如果这些类型没有提供适当的getter和setter方法,可以考虑实现`org.hibernate.UserType`接口来定义自定义类型。这样可以在不修改原有类的情况下完成持久化任务。 #### ...
例如,通过实现` UserType`接口可以扩展Hibernate对特定数据类型的处理能力。 8. **性能优化**: 深入源代码,我们可以了解Hibernate的延迟加载(Lazy Loading)、批处理(Batch Processing)等性能优化策略,这些...
- **自定义数据类型**:通过实现 `org.hibernate.usertype.UserType` 接口来自定义数据类型。 通过以上内容的学习,可以全面理解 Hibernate 的基本原理和使用方法,掌握其核心概念和技术要点,从而能够有效地利用 ...
Hibernate允许开发者定义自己的类型,通过实现`UserType`接口,可以处理自定义的数据类型。此外,`HibernateTypeConverter`可以用于字段在Java类型和数据库类型之间的转换。 11. **性能优化** 优化包括但不限于:...
UserType接口要求实现者提供一系列的方法来定义自定义数据类型的行为,包括对象的序列化和反序列化、深拷贝、对象比较、散列值计算、是否可变以及如何在Java对象和数据库之间进行类型转换等。通过这种方式,我们可以...