例子如下:
假如name不是String是一个类,这样user和name的映射关系可以为多对一或是一对一,此时是将数据user和那么分别保存到两张表中。
假设Name这个数据太小,小到可以不用物理表保存数据,此时就不用考虑一对一和多对一,此时是将数据user和那么分别保存到一张表中。
下面精华都在映射文件中:
当两个对象有关联,(1)希望数据分别保存俩表的(多对一)
(2)希望数据保存到一张表(有一表数据少或是自定义类型)
代码如下:
User.java
package cn.itcast.hibernate.domain;
import java.util.Date;
public class User {
private int id;
//private String name;
private Name name;
private Date birthday;
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
Name.java
package cn.itcast.hibernate.domain;
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;
}
}
User.hbm.xml
<?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">
<hibernate-mapping package="cn.itcast.hibernate.domain">
<class name="User" table="tb_user">
<!-- 对象标示符,类型可以不写,hibernate自己识别 -->
<id name="id" column="id">
<!-- 指定主键生成方式。
native根据方言判定生成主键的方式
-->
<generator class="native"/>
</id>
<component name="name">
<property name="firstName" column="first_name"></property>
<property name="lastName" column="last_name"></property>
</component>
<property name="birthday" />
</class>
</hibernate-mapping>
粗暴的测试类:
public class QueryText_Name {
/**
* 组件关联关系的映射与原理分析
* Name与user之间的关系:一对一或是多对一(有多个人叫一个名字)
*/
public static void main(String[] args) {
User user = new User();
user.setBirthday(new Date());
Name name = new Name();
name.setFirstName("firstName");
name.setLastName("LastName");
user.setName(name);
HIbernateUtil.add(user);
User getuser=(User)HIbernateUtil.get(User.class, user.getId());
System.out.println(getuser.getName().getFirstName()+" "+getuser.getName().getLastName());
}
工具类:
package cn.itcast.hibernate;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
/*
* 想让初始化创建只执行一次
* 方式1:单例模式
* 方式2: 静态语句块等
*
* 由于只想让初始化执行一次,不想让其他类继承所以此类用final修饰,不想被其他类初始化所以默认构造用private修饰,由于在静态语句块中所以加static
*
*
*/
public final class HIbernateUtil {
private static SessionFactory sessionfactory;
private HIbernateUtil(){
}
static {
Configuration cfg = new Configuration();
cfg.configure();
//cfg.configure("filename"); 可以通过filename来指定配置文件的位置和配置文件名(如果不在默认classpath的位置下)
//所用的src下的文件都会经行编译,最后字节码文件在classpath下,bin是classpath下的一部分
sessionfactory = cfg.buildSessionFactory();
}
/*
* 创建出对象,通过getter方法方便外接使用
*
*/
public static SessionFactory getSessionfactory() {
return sessionfactory;
}
/**
* 此session包为org.hibernate.Session;
* @return
* 定义方法返回session,session你可以理解为jdbc的数据库连接
*/
public static Session getSession(){
return sessionfactory.openSession();
}
/**
* 通用保存方法
* @param entity
*/
public static void add(Object entity){
Session s = null;
Transaction tx = null;
try {
s=HIbernateUtil.getSession();
tx = s.beginTransaction();
s.save(entity);
tx.commit();
} finally {
if(s!=null){
s.close();
}
}
}
/**
* 通用更新方法
* @param entity
*/
public static void update(Object entity){
Session s = null;
Transaction tx = null;
try {
s=HIbernateUtil.getSession();
tx = s.beginTransaction();
s.update(entity);
tx.commit();
} finally {
if(s!=null){
s.close();
}
}
}
/**
* 通用删除方法
* @param entity
*/
public static void delete(Object entity){
Session s = null;
Transaction tx = null;
try {
s=HIbernateUtil.getSession();
tx = s.beginTransaction();
s.delete(entity);
tx.commit();
} finally {
if(s!=null){
s.close();
}
}
}
/**
* 通用根据ID查询方法
* @param entity
*/
public static Object get(Class clazz,Serializable id){
Session s = null;
try {
s=HIbernateUtil.getSession();
Object obj = s.get(clazz, id);
return obj;
} finally {
if(s!=null){
s.close();
}
}
}
}
tb_user表库中结构
-- Create table
create table TB_USER
(
ID NUMBER(10) not null,
FIRST_NAME VARCHAR2(255),
LAST_NAME VARCHAR2(255),
BIRTHDAY DATE
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table TB_USER
add primary key (ID)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);