持久化类就是系统中有关业务实体的类(例如;电子商务系统中的
顾客类和订单类)。 并不是所有的持久化类的实例都处于持久化状态,
—— 可能是临时态(transient)或游离态(detached)。
如果遵守一些简单的约定,hibernate会工作的更好。 然而,这些
约定都不是强制的。事实上,Hibernate3 采取了遵守更少约定的策略。
你可以使用其他方式来表达一个实体域: 例如, 使用map树。
4.1 一个简单的POJO例子
大部分的java应用都使用一个扁平的持久化类。
package eg;
import java.util.Set;
import java.util.Date;
public class Cat {
private Long id; // identifier
private Date birthdate;
private Color color;
private char sex;
private float weight;
private int litterId;
private Cat mother;
private Set kittens = new HashSet();
private void setId(Long id) {
this.id=id;
}
public Long getId() {
return id;
}
void setBirthdate(Date date) {
birthdate = date;
}
public Date getBirthdate() {
return birthdate;
}
void setWeight(float weight) {
this.weight = weight;
}
public float getWeight() {
return weight;
}
public Color getColor() {
return color;
}
void setColor(Color color) {
this.color = color;
}
void setSex(char sex) {
this.sex=sex;
}
public char getSex() {
return sex;
}
void setLitterId(int id) {
this.litterId = id;
}
public int getLitterId() {
return litterId;
}
void setMother(Cat mother) {
this.mother = mother;
}
public Cat getMother() {
return mother;
}
void setKittens(Set kittens) {
this.kittens = kittens;
}
public Set getKittens() {
return kittens;
}
// addKitten not needed by Hibernate
public void addKitten(Cat kitten) {
kitten.setMother(this);
kitten.setLitterId( kittens.size() );
kittens.add(kitten);
}
}
这里主要有4个规则去遵守。
4.1.1 一个无参的构造方法
Cat 拥有一个无参的构造方法。 所有的持久化类都应该有一个默认的
无参的构造方法(可以不为public)以便hibernate调用Constructor.newInstance()
来对它进行实例化。我们强烈建议至少拥有一个包可见性的
默认构造方法。
4.1.2 提够一个标识符属性(可选)
Cat用户一个名为id的标识符。此属性映射到数据库表的主键列。
可以使用任何的基本类型或基本类型的包装类或 java.lang.String 或 java.util.Date来作为标识符。
(如过你的遗留数据库采用组合键, 你可以自定义一个class, class
属性为组合键)
标识符属性不是必须的,你可以不写(但不推荐)
我们建议你在持久化类中使用一致的标识符。我们更加建议
使用一个非null(不是基本类型)的类型。
4.1.3推荐使用非final的类(可选)
Hibernate的一个典型特征是代理,proxy依赖于非final 且 方法类型为
public的类。
你可以借助Hibernate持久化一个final类型的class, 但是, 此种情况你
便不能使用延迟加载,这也在一定程度上限制了你的程序。
你也应该避免使用final类型的方法。如果你使用了final类型的方法,
你必须设置lazy="false"。
4.1.4 声明持久化字段的set/get
Cat为所有的持久化字段声明了访问方法。
属性无需声明为public类型,Hibernate可以持久化任何一个具有默认
访问类型 或private或protected类型的属性。
4.2 实现继承
一个子类必须遵守第一和第二条规定。他从父类中继承标识符。
package eg;
public class DomesticCat extends Cat {
private String name;
public String getName() {
return name;
}
protected void setName(String name) {
this.name=name;
}
}
4.3 实现equals() 和hashCode()
如果你打算将持久化类的游离态的实例放到一个set中去时你必须复写equals()和
hashCode()方法。因为Hibernate只能在一个session内部保证java标识符和
数据库主键列相等。
推荐使用业务字段来实现equals()和hashCode(), 而不是主键。
public class Cat {
...
public boolean equals(Object other) {
if (this == other) return true;
if ( !(other instanceof Cat) ) return false;
final Cat cat = (Cat) other;
if ( !cat.getLitterId().equals( getLitterId() ) ) return false;
if ( !cat.getMother().equals( getMother() ) ) return false;
return true;
}
public int hashCode() {
int result;
result = getMother().hashCode();
result = 29 * result + getLitterId();
return result;
}
}
4.4 动态模型
注意: 动态模型短时间内仍处于试验状态, 有可能会进行修改。
持久化的实体无需在运行期间被声明为POJO类型或一个javabean。Hibernate
支持动态模型和以DOM4j树的形式来展现实体。通过这种方法,你可以仅仅使用
映射文件来描述一个持久化类。
默认情况下,Hibernate工作在POJO模式下,你可以使用default_entity_mode
来设定一个默认模式。
分享到:
相关推荐
"Hibernate自动生成持久化类和映射文件"这个话题主要涉及如何利用myEclipse这款集成开发环境的反向工程功能,快速地根据数据库中的表结构生成对应的Hibernate配置文件、映射文件以及持久化类。下面将详细介绍这一...
Java持久化类是Java编程中一个重要的概念,主要用于在数据库和应用程序之间建立数据的桥梁,使得数据能够在内存中的对象和数据库记录之间进行有效地转换和管理。在这个场景中,提到的"一个简单的java持久化类"可能是...
在“XDoclet插件包以及从Java持久化类生成hibernate mapping小例子”中,我们重点关注的是如何通过XDoclet从Java持久化类生成与Hibernate相关的配置文件。首先,我们需要在Java类中添加特定的XDoclet注解,这些注解...
【Java的Hibernate框架中的持久化类】 在Java的Hibernate框架中,持久化类是核心概念之一,它代表了数据库中的实体或者表。这些类通常被称为POJO(Plain Old Java Object),表示它们只是普通的Java对象,没有特定的...
在MyEclipse中,自动生成可持久化类的映射文件是提高开发效率的一个重要功能。这使得开发者能够快速地创建与数据库表对应的Java对象,同时生成对应的Hibernate映射文件(*.hbm.xml),简化了数据库操作的过程。以下是...
Hibernate中根据数据库中各表,使用myEclipse的返向工程,自动生成hibernate.cfg.xml 配置文件 与person.hbm.xml映射文件和持久化类 (图文介绍)
Hibernate、iBATIS、TopLink、Castor JDO、Apache OJB等这么多持久层框架,你还在为学习上面那个框架而苦恼吗?你还为研究下一代是那个而头疼吗? 朋友,学习JPA吧!JPA的出现就是解决您上面的苦恼的。
- 最后,编写持久化类(如`Customer.java`),它与`customer`表相对应,采用POJO(Plain Old Java Object)模式,包含了与数据库表字段相对应的属性。 3. **持久化类(Customer.java)**: 持久化类通常包含与...
本文将详细介绍如何在Android中使用Ormlite对`UserAccount`类进行持久化配置。 首先,我们需要创建一个`UserAccount`类,该类代表用户账户信息,包含以下六个字段: ```java public class UserAccount { @...
4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可...
在Java的Hibernate框架中,Session和持久化类是核心组件,它们构成了ORM(对象关系映射)的基础。Hibernate作为SSH(Struts、Spring、Hibernate)三大Web开发框架之一,简化了Java应用程序对数据库的操作。 Session...
4. **持久化类(Persistent Class)**: 实体类必须是可序列化的,即实现`Serializable`接口,这样才能确保对象能够在内存中持久化。 5. **会话(Session)**: Hibernate的会话接口是操作数据库的主要入口点,它负责...
标题中的“消息和主题(持久化-非持久化)分类--持久化订阅”指的是在分布式消息传递系统中,特别是基于发布/订阅模型的系统中,关于消息存储和处理的两种不同策略:持久化和非持久化订阅。在这个场景下,我们将深入...
本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型属性和包装类型属性 102 5.1.2 ...
3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过Hibernate API操纵数据库 3.5.1 Hibernate的初始化 3.5.2 访问Hibernate的Session接口 3.6 运行helloapp应用 3.6.1 创建运行本书范例的系统环境 ...
本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型属性和包装类型属性 102 5.1.2 ...
在IBM WebSphere MQ中,消息持久化是一个重要的特性,它确保了当队列管理器发生异常时,消息数据的安全性和一致性。以下是对IBM WebSphere MQ消息持久化相关知识点的详细说明。 首先,消息持久化是指消息的可靠性...
在Java编程中,持久化是将数据保存到可长期存储的介质中,以便在后续的程序运行中可以恢复和使用这些数据。JavaBean和XML在Java持久化中扮演着重要的角色。JavaBean是一种符合特定规范的Java类,通常用于封装数据,...