Hibernate的一对多、多对一、一对一、多对多关联就不说了,但需要注意的。由于多对多映射在查询时需涉及到三张表,效率比较低,故使用时需要谨慎。
另外,Hibernate中的组件映射是一个比较有用的东东。比如对于一个People类,它的name属性不是基本类型,而是引用类型,即是一个包含firstName和lastName属性的类。那么如何将People和数据库中的people表对应起来呢?这就要用到组件映射。
例子如下:
people表的创建语句如下:
create table people
(
id int primary key,
first_name varchar2(50),
last_name varchar2(50)
)
Name类的定义:
package com.HibernateDemo.dao;
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;
}
}
People类的定义:
package com.HibernateDemo.dao;
public class People {
private int id;
private Name name;
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;
}
}
People.hbm.xml的配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.HibernateDemo.dao">
<class name="People" table="people">
<id name="id">
<generator class="assigned"/>
</id>
<component name="name" class="Name">
<property name="firstName" column="first_name"></property>
<property name="lastName" column="last_name"></property>
</component>
</class>
</hibernate-mapping>
测试方法如下:
public void add()
{
Session session=null;
Transaction tran=null;
try{
session=HibernateUtil.getSession();
tran=session.beginTransaction();
People people=new People();
Name name=new Name();
name.setFirstName("firstName");
name.setLastName("lastName");
people.setName(name);
people.setId(1);
session.save(people);
tran.commit();
System.out.println("end");
}
catch(HibernateException ex)
{
tran.rollback();
ex.printStackTrace();
}
finally{
if(session!=null)
{
session.close();
}
}
}//save