持久化类

持久化类就是系统中有关业务实体的类(例如;电子商务系统中的
顾客类和订单类)。 并不是所有的持久化类的实例都处于持久化状态,
—— 可能是临时态(transient)或游离态(detached)。

如果遵守一些简单的约定,hibernate会工作的更好。 然而,这些
约定都不是强制的。事实上,Hibernate3 采取了遵守更少约定的策略。
你可以使用其他方式来表达一个实体域: 例如, 使用map树。
[b]4.1 一个简单的POJO例子[/b]

大部分的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类型的属性。

[b]4.2 实现继承[/b]
一个子类必须遵守第一和第二条规定。他从父类中继承标识符。
package eg;

public class DomesticCat extends Cat {
private String name;

public String getName() {
return name;
}
protected void setName(String name) {
this.name=name;
}
}



[b]4.3 实现equals() 和hashCode()[/b]
如果你打算将持久化类的游离态的实例放到一个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;
}

}


[b]4.4 动态模型[/b]
注意: 动态模型短时间内仍处于试验状态, 有可能会进行修改。
持久化的实体无需在运行期间被声明为POJO类型或一个javabean。Hibernate
支持动态模型和以DOM4j树的形式来展现实体。通过这种方法,你可以仅仅使用
映射文件来描述一个持久化类。
默认情况下,Hibernate工作在POJO模式下,你可以使用default_entity_mode
来设定一个默认模式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值