所谓细粒度 就是更加细化类对数据库的操作。在数据库中一个表,在多个POJO中操作,这样
是数据的处理更加清晰易于理解。今天通过对Person送货单的代码编写有一下收获。
首先设计数据库只有一张表Person,这样简化了大量的DAO的持久层的操作使得程序逻辑性更强,不容易出错,更加通俗易懂.
drop table person ;
create table person
(
id int primary key not null ,
firstname varchar(20) not null ,
lastname varchar(20) not null ,
address varchar(50) not null ,
zipcode varchar(6) not null ,
tel varchar(20) not null
) ;
select * from person ;
设计POJO类,分别有Name、Contact、Person三个类做好对数据库表中的映射以下是配置文件
(通过Component子属性加入我所在类所需要的属性值做好表到类的映射)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.lw.hibernate.demo2.Person" table="person"
catalog="person">
<id name="id" type="int">
<column name="id" />
<generator class="assigned"></generator>
</id>
<component name="name" class="org.lw.hibernate.demo2.Name">
<property name="firstname" type="string">
<column name="firstname" length="20" not-null="true" />
</property>
<property name="lastname" type="string">
<column name="lastname" length="20" not-null="true" />
</property>
</component>
<component name="contact"
class="org.lw.hibernate.demo2.Contact">
<property name="address" type="string">
<column name="address" length="50" not-null="true" />
</property>
<property name="zipcode" type="string">
<column name="zipcode" length="6" not-null="true" />
</property>
<property name="tel" type="string">
<column name="tel" length="20" not-null="true" />
</property>
</component>
</class>
</hibernate-mapping>
POJO类上代码
package org.lw.hibernate.demo2;
public class Name {
private String firstname;
private String lastname;
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
}
package org.lw.hibernate.demo2;
public class Contact {
private String address;
private String zipcode;
private String tel;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
package org.lw.hibernate.demo2;
public class Person {
private int id;
private Name name;
private Contact contact;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
}
这里用到了依赖注入、实体层映射确实是意见不容易的事情,在业务模块中,使用细粒度划分可以更加
是操作更加简便容易理解,减少了许多复杂的数据库操作。
(注:这步配置一定按步骤来做,要不老是报map映射错误)
最后上操作类中里面取出全局session。对数据库进行操作
package org.lw.hibernate.demo2;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class PersonOperate {
private Session session ;
//这个构造初始化是一般步骤 重配置文件中取出session 在开发中最好定义个类或放进配置文件里
//之要用到hibernate都会用到它
public PersonOperate(){
Configuration config = new Configuration().configure() ;
SessionFactory factory = config.buildSessionFactory() ;
this.session = factory.openSession() ;
}
public void insert(Person p){
this.session.save(p) ;
this.session.beginTransaction().commit() ;
}
}
最后上测试类···验证数据的插入
package org.lw.hibernate.demo2;
public class POTest {
public static void main(String args[]){
Person p = new Person() ;
Name n = new Name() ;
Contact c = new Contact() ;
PersonOperate po = new PersonOperate() ;
n.setFirstname("李") ;
n.setLastname("维");
c.setAddress("湖南郴州") ;
c.setTel("15084844428") ;
c.setZipcode("423000") ;
p.setId(1) ;
p.setName(n) ;
p.setContact(c) ;
po.insert(p) ;
}
}
如果你的数据插入成功,恭喜您,又学会一种用面向对象的思想来操作关系型数据库的映射对应关系。。