概念
假如有这样一张数据表
DROP TABLE IF EXISTS User;
CREATE TABLE USER(
uid VARCHAR(20),
name VARCHAR(50),
age INT,
birthday DATE,
address VARCHAR(100),
zipcode VARCHAR(50),
phone VARCHAR(50),
CONSTRAINT pk_uid PRIMARY KEY(uid)
);
按照Hibernate的传统做法,应该建立一个POJO类与之映射,即:
public class User {
private String uid;
private String name;
private Integer age;
private Date birthday;
private String address;
private String zipcode;
private String phone;
//方法省略
}
数据表与POJO类就形成了如下关系:
然而以上的对应关系不符合面向对象的定义,即我们不应该将所有的表中字段全部映射为一个POJO类中的属性,以以上代码为例,它可以分为3个组成:User类,UserBasic类和UserContract。
UserBasic类:
import java.sql.Date;
public class UserBasic {
private String name;
private Integer age;
private Date birthday;
}
UserContract类:
public class UserContract {
private String address;
private String zipcode;
private String phone;
}
Usert类:
public class User {
private String uid;
private UserBasic userBasic = new UserBasic();
private UserContract userContract = new UserContract();
}
其应该符合以下的对应关系:
基于*.hbm.xml实现细粒度划分
虽然现在只有一张User表,但是却有三个实体类,并且这些实体类之间是有引用关系的,而要想使用使用Hibernate开发,就必须将这些关系在配置文件中展示。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.gub.vo.User" table="user" schema="company">
<!--不更换如何操作,每一个*.hbm.xml文件只会与一个POJO类关联-->
<id name="uid" column="uid"/>
<!--此处配置的是User类中的userBasic属性的类型及包含的内容-->
<component name="userBasic" class="com.gub.vo.UserBasic">
<property name="name" column="name"/>
<property name="age" column="age"/>
<property name="birthday" column="birthday"/>
</component>
<!--此处配置的是User类中的userContract属性的类型及包含的内容-->
<component name="userContract" class="com.gub.vo.UserContract">
<property name="address" column="address"/>
<property name="zipcode" column="zipcode"/>
<property name="phone" column="phone"/>
</component>
</class>
</hibernate-mapping>
配置完成之后,直接使用程序进行增加测试:
package test;
import com.gub.dbc.HibernateSessionFactory;
import com.gub.vo.User;
import java.util.Date;
public class UserTest {
public static void main(String[] args) {
User user = new User();
user.setUid("NicholasGUB");
user.getUserBasic().setName("GUB");
user.getUserBasic().setAge(22);
user.getUserBasic().setBirthday(new Date());
user.getUserContract().setAddress("xx省xx市");
user.getUserContract().setPhone("15600777563");
user.getUserContract().setZipcode("x-c105102");
HibernateSessionFactory.getSession().save(user);
HibernateSessionFactory.getSession().beginTransaction().commit();
HibernateSessionFactory.closeSession();
}
}
运行程序发现数据保存成功:
增加测试完成之后,在对数据读取进行测试:
package test;
import com.gub.dbc.HibernateSessionFactory;
import com.gub.vo.User;
public class UserTest {
public static void main(String[] args) {
User user = (User)HibernateSessionFactory.getSession().get(User.class,"NicholasGUB");
System.out.println(user);
HibernateSessionFactory.closeSession();
}
}
运行程序发现数据读取成功:
User{uid=‘NicholasGUB’, userBasic=UserBasic{name=‘GUB’, age=22, birthday=2020-05-12 08:00:00.0}, userContract=UserContract{address=‘xx省xx市’, zipcode=‘x-c105102’, phone=‘15600777563’}}
基于Annotation的细粒度划分
首先生成一个基于Annotation配置的User类,随后进行修改
- 创建支持Annotation配置的UserBasic类
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Date;
@SuppressWarnings("serial")
@Embeddable
@AttributeOverrides({
@AttributeOverride(name="name",column = @Column(name="name")),
@AttributeOverride(name="age",column = @Column(name="age")),
@AttributeOverride(name="birthday",column = @Column(name="birthday"))
})
public class UserBasic implements Serializable {
private String name;
private Integer age;
private Date birthday;
//Setter、Getter略
}
- 创建支持Annotation配置的UserContract类
import javax.persistence.*;
import java.io.Serializable;
@SuppressWarnings("serial")
@Embeddable
@AttributeOverrides({
@AttributeOverride(name = "address",column = @Column(name="address")),
@AttributeOverride(name = "zipcode",column = @Column(name="zipcode")),
@AttributeOverride(name = "phone",column = @Column(name="phone"))
})
public class UserContract implements Serializable {
private String address;
private String zipcode;
private String phone;
//Setter、Getter略
}
- 修改User类定义
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
private String uid;
private UserBasic basic = new UserBasic();
private UserContract contract = new UserContract();
@Id
@Column(name = "uid")
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public UserBasic getBasic() {
return basic;
}
public void setBasic(UserBasic basic) {
this.basic = basic;
}
public UserContract getContract() {
return contract;
}
public void setContract(UserContract contract) {
this.contract = contract;
}
}
使用上例的测试代码进行测试,发现结果与在*.hbm.xml文件的配置相同。