??xml version="1.0" encoding="utf-8" standalone="yes"?>
下蝲HibernateQ例?.0.3E_版本Q解压羃Q可以看C个hibernate2.jar和lib目录下有22个jar包:
hibernate2.jar:
Hibernate的库Q没有什么可说的Q必M用的jar?/span>
cglib-asm.jar:
CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库Q必M用的jar?/span>
dom4j.jar:
dom4j是一个Java的XML APIQ类gjdomQ用来读写XML文g的。dom4j是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的YӞ可以在SourceForge上找到它。在IBM developerWorks上面可以扑ֈ一文章,对主的Java XML APIq行的性能、功能和易用性的评测Qdom4j无论在那个方面都是非常出色的。我早在近两年之前开始用dom4jQ直到现在。如今你可以看到来多的Java软g都在使用dom4j来读写XMLQ特别值得一提的是连Sun的JAXM也在用dom4j。这是必M用的jar包,Hibernate用它来读写配|文件?/span>
odmg.jar:
ODMG是一个ORM的规范,Hibernate实现了ODMG规范Q这是一个核心的库,必须使用的jar包?/span>
commons-collections.jarQ?/span>
Apache Commons包中的一个,包含了一些Apache开发的集合c,功能比java.util.*强大。必M用的jar包?/span>
commons-beanutils.jarQ?/span>
Apache Commons包中的一个,包含了一些Bean工具cȝ。必M用的jar包?/span>
commons-lang.jar:
Apache Commons包中的一个,包含了一些数据类型工LQ是java.lang.*的扩展。必M用的jar包?/span>
commons-logging.jar:
Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本n包含了一个Simple LoggerQ但是功能很弱。在q行的时候它会先在CLASSPATH找log4jQ如果有Q就使用log4jQ如果没有,找JDK1.4带的java.util.loggingQ如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾Q当初Apache极力游说Sun把log4j加入JDK1.4Q然而JDK1.4目组已经接近发布JDK1.4产品的时间了Q因此拒l了Apache的要求,使用自己的java.util.loggingQ这个包的功能比log4j差的很远Q性能也一般?/span>
后来Apache开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的logE序Q底层的Logger是可以切换的Q你可以选择log4jQjava.util.logging或者它自带的Simple Logger。不q我仍然强烈使用log4jQ因为log4j性能很高Qlog输出信息旉几乎{于System.outQ而处理一条logq_只需?us。你可以在Hibernate的src目录下找到Hibernate已经Z准备好了的log4j的配|文Ӟ你只需要到Apache |站M载log4j可以了。commons-logging.jar也是必须的jar包?/span>
使用Hibernate必须的jar包就是以上的q几个,剩下的都是可选的?/span>
ant.jar:
Ant~译工具的jar包,用来~译Hibernate源代码的。如果你不准备修改和~译Hibernate源代码,那么没有什么用Q可选的jar?/span>
optional.jarQ?/span>
Ant的一个辅助包?/span>
c3p0.jarQ?/span>
C3PO是一个数据库q接池,Hibernate可以配置Z用C3POq接池。如果你准备用这个连接池Q就需要这个jar包?/span>
proxool.jarQ?/span>
也是一个连接池Q同上?/span>
commons-pool.jar, commons-dbcp.jar:
DBCP数据库连接池QApache的Jakartal织开发的QTomcat4的连接池也是DBCP?/span>
实际上Hibernate自己也实C一个非帔R常简单的数据库连接池Q加上上?个,你实际上可以在Hibernate上选择4U不同的数据库连接池Q选择哪一个看个h的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中用HibernateQ一定要用App Server的连接池Q不要用以上4U连接池Q否则容器管理事务不起作用?/span>
connector.jar:
JCA 规范Q如果你在App Server上把Hibernate配置为Connector的话Q就需要这个jar。不q实际上一般App Server肯定会带上这个包Q所以实际上是多余的包?/span>
jaas.jar:
JAAS是用来进行权限验证的Q已l包含在JDK1.4里面了。所以实际上是多余的包?/span>
jcs.jarQ?/span>
如果你准备在Hibernate中用JCS的话Q那么必d括它Q否则就不用?/span>
jdbc2_0-stdext.jar:
JDBC2.0的扩展包Q一般来说数据库q接池会用上它。不qApp Server都会带上Q所以也是多余的?/span>
jta.jarQ?/span>
JTA规范Q当Hibernate使用JTA的时候需要,不过App Server都会带上Q所以也是多余的?/span>
junit.jar:
Junit包,当你q行Hibernate自带的测试代码的时候需要,否则׃用?/span>
xalan.jar, xerces.jar, xml-apis.jar:
Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上QJDK1.4也包含了解析器,不过不是XercesQ是CrimsonQ效率比较差Q不qHibernate用XML只不q是d配置文gQ性能没什么紧要的Q所以也是多余的?
create database if not exists `sampledb`;
use `sampledb`;
/*table structure for table `sampledb`.`personinfo` */
drop table if exists `sampledb`.`room`;
create table room (
room_id int not null auto_increment,
address varchar(32) not null default '',
primary key (room_id)
) type=innodb;
create database if not exists `sampledb`;
use `sampledb`;
/*table structure for table `sampledb`.`personinfo` */
drop table if exists `sampledb`.`user`;
create table user (
user_id int not null auto_increment,
name varchar(16) not null default '',
room_id int not null,
index (room_id),
foreign key (room_id) references room(room_id),
primary key (user_id)
) type=innodb;
二、User.java
package com.tanm.test;
publicclass User {
privatelongid;
private String name;
private Room room;
publiclong getId() {
returnid;
}
publicvoid setId(long id) {
this.id = id;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
public Room getRoom() {
returnroom;
}
publicvoid setRoom(Room room) {
this.room = room;
}
}
三?span style="font-size: 10pt">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>
<class name="com.tanm.test.User" table="user">
<id name="id" column="user_id" type="long">
<generator class="increment"/>
</id>
<property name="name" column="name" type="string" not-null="true" />
<many-to-one name="room" column="room_id" class="com.tanm.test.Room" />
</class>
</hibernate-mapping>
四、Room.java
package com.tanm.test;
import java.util.HashSet;
import java.util.Set;
publicclass Room {
privatelongid;
private String address;
private Set users = new HashSet();
public String getAddress() {
returnaddress;
}
publicvoid setAddress(String address) {
this.address = address;
}
publiclong getId() {
returnid;
}
publicvoid setId(long id) {
this.id = id;
}
public Set getUsers() {
returnusers;
}
publicvoid setUsers(Set users) {
this.users = users;
}
}
五、Room.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>
<class name="com.tanm.test.Room" table="room">
<id name="id" column="room_id" unsaved-value="0">
<generator class="increment"/>
</id>
<property name="address" column="address" type="string" not-null="true" />
<set name="users" table="user" inverse="true" cascade="all">
<key column="room_id"/>
<one-to-many class="com.tanm.test.User"/>
</set>
</class>
</hibernate-mapping>
六、Test.java
package com.tanm.test;
import org.hibernate.*;
import org.hibernate.cfg.*;
publicclass Test {
publicstaticvoid main(String[] args) throws HibernateException {
SessionFactory sessionFactory = new Configuration().configure()
.buildSessionFactory();
Room room = new Room();
room.setAddress("China_xi'an");
User user1 = new User();
user1.setName("111");
User user2 = new User();
user2.setName("222");
user1.setRoom(room);
user2.setRoom(room);
room.getUsers().add(user1);
room.getUsers().add(user2);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(room);
tx.commit();
session.close();
sessionFactory.close();
}
}
成功q行后的l果Q?/span>
Hibernate: insert into room (address, room_id) values (?, ?)
Hibernate: insert into user (name, room_id, user_id) values (?, ?, ?)
Hibernate: insert into user (name, room_id, user_id) values (?, ?, ?)Database:mysql
drop database if exists SAMPLEDB;
create database hello;
use hello;
create table CUSTOMERS (
ID int not null primary key,
NAME varchar(15) not null,
PASSWORD varchar(8) not null
);
2。在eclipse 中新建工E?/span>hbtest
3。在src中新?/span>package hbm
4。新?/span>pojoc?/span>Customer
package hbm;
public class Customer {
private int id;
private String name;
private String password;
/**
* @return Returns the id.
*/
public int getId() {
return id;
}
/**
* @param id
* The id to set.
*/
public void setId(int id) {
this.id = id;
}
/**
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* @param name
* The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the password.
*/
public String getPassword() {
return password;
}
/**
* @param password
* The password to set.
*/
public void setPassword(String password) {
this.password = password;
}
//constructor
public Customer() {
}
}
5。?/span>myeclipse插g建立hibernate.cfg.xml 位于src目录?/span>
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hello</property>
<property name="myeclipse.connection.profile">hbmysql</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<mapping resource="hbm/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
6。在hbm package内新?/span>Customer.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">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-mapping>
<class name="hbm.Customer" table="CUSTOMERS">
<id name="id" column="ID" type="int">
<generator class="increment"/>
</id>
<property name="name" column="NAME" type="string" not-null="true"/>
<property name="password" column="PASSWORD" type="string" not-null="true"/>
</class>
</hibernate-mapping>
7。?/span>hibernate操作数据?/span>
package hbm;
import org.hibernate.*;
import org.hibernate.cfg.*;
import java.util.Iterator;
import java.util.List;
public class Hbmain {
public static SessionFactory sessionFactory;//数据存储?/span>
static {
try {
Configuration config = new Configuration().configure();
sessionFactory = config.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 一?/span>customer对象存入database
* @Customer customer Object
*/
public void saveCustomer(Customer ct) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(ct);
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/*
* 查找所有的customer object
*/
public void findAll() {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
List customers = session.createQuery(
"from Customer as c order by c.name asc").list();
Iterator it = customers.iterator();
System.out.println("append:"+customers.size());
while(it.hasNext())
{
Customer c = (Customer)it.next();
System.out.println("ID:" + c.getId());
System.out.println("Name:" + c.getName());
System.out.println("Pass:" + c.getPassword());
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
/*
* 修改customer Name
* @name
*/
public void loadUpdate(int customer_id, String name) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Customer c = (Customer) session.load(Customer.class, customer_id);
c.setName(name);
tx.commit();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
}
/*
* 试以上的方?/span>
* save() find() update()
*/
public void test()
{
Customer ct = new Customer();
//ct.setId(5);
ct.setName("buaa");
ct.setPassword("5768");
this.saveCustomer(ct);
this.findAll();
this.loadUpdate(ct.getId(),"phop");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Hbmain hb = new Hbmain();
hb.test();
sessionFactory.close();
}
}
参考书是孙卫琴?lt;_NHibernate>
hibernate 3 + mysql 5.0
1 书上的例子第2?初始?hibernate Configuration实例
代码如下Q?/span>
Configuration config = new Configuration();
config.addClass("Customer.class");
SessionFactory sessionfactory = config.buildSessionFactory();
配置文g?hibernate.properties
q行出错 Q提CZؓ
org.hibernate.HibernateException: database product name cannot be null
昄是配|文件的问题
我用的配|文件是 hibernate.cfg.xml
修改Z下代?成功q行
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
原因:使用了xm作ؓ配置文gQ而没有选择properties文g,应该使用new Configuration().config();
2 书上例子W六章一对多映射
customer.hbm.xml ?/span>
原代码ؓ
<hibernate-mapping>
<class name="demo1.Customer" table="CUSTOMERS">
<id name="id" type="long" column="ID">
<generator class="increment" />
</id>
<property name="name" type="string">
<column name="NAME" length="15" />
</property>
</class>
</hibernate-mapping>
此时执行其Business.java?/span>
Customer customer = (Customer) session.load(Customer.class,
new Long(customer_id));
出现如下错误
1 Exception in thread "main" java.lang.NullPointerException
2 at org.hibernate.tuple.AbstractTuplizer.createProxy(AbstractTuplizer.java:249)
3 at org.hibernate.persister.entity.BasicEntityPersister.createProxy(BasicEntityPersister.java:2831)
4 at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:218)
5 at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:163)
6 at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:79)
7 at org.hibernate.impl.SessionImpl.load(SessionImpl.java:603)
8 at org.hibernate.impl.SessionImpl.load(SessionImpl.java:596)
修改?/span>
<hibernate-mapping default-lazy="false">
<class name="demo1.Customer" table="CUSTOMERS">
<id name="id" type="long" column="ID">
<generator class="increment" />
</id>
<property name="name" type="string">
<column name="NAME" length="15" />
</property>
</class>
</hibernate-mapping>
问题解决
原因在于Q?Hibernate 3.0 与Hibernate2.1的源代码是不兼容?br /> 在Hibernate2.1中,lazy属性的默认gؓ“false”Q而在Hibernate3.0中,lazy属性的默认gؓ“true”?/span>