Hibernate细粒度划分

概念

假如有这样一张数据表

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类,随后进行修改

  1. 创建支持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略
}
  1. 创建支持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略

}
  1. 修改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文件的配置相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值