例子如下:
假如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 );