很久没有用hibernate了,由于自己要做个小东西,想了想,准备使用最新的包。每次用新包都会蛮烦连连,这次怎能例外???3.4蛮是折腾了我一下下。
1 slf4j
project编译的时候完全没问题,直到运行的时候,提示:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 超级郁闷。
这是因为Hibernate3.4使用SLF4J API记录日志,所以在Hibernate的lib中,不再提供Log4J的包,而大部分框架依然使用Log4J记录日志,这样导致了兼容性问题。
解决办法:3包并存。
1、log4j包
log4j-1.2.15.jar
2、转换包
slf4j-log4j12-1.5.2.jar(http://mirrors.ibiblio.org/pub/mirrors/maven2/org/slf4j/slf4j-log4j12/1.5.2/slf4j-log4j12-1.5.2.jar)
3、slf4j包
slf4j-api-1.5.2.jar
2annotation
annotation的好处是不需要处理hbm.xml以及运行xDoclet来生产表。啃,可是我对annotation的认识还是皮毛。今天决心记录一个入门log。
1 hibernate.cfg.xml 的变化:
<?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"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/demo</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.hbm2ddl.auto">create-drop</property> <property name="show_sql">true</property> <mapping class="mars.User" /> </session-factory> </hibernate-configuration>
属性hibernate.hbm2ddl.auto 是让hibernate自动更新数据库schema的。
参数hibernate.hbm2ddl.auto可以是以下值:
validate 加载hibernate时,验证创建数据库表结构
create 每次加载hibernate,重新创建数据库表结构
create-drop 加载hibernate时创建,退出是删除表结构。在项目测试阶段特别的好用
update 加载hibernate自动更新数据库结构
<mapping class="mars.User" />
从前是这么写的:
<mapping resource="onlyfun/first/User.hbm.xml" />
2 sessionFactory的变化:
package mars;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration
().configure().buildSessionFactory();
} catch (Throwable ex) {
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession() throws HibernateException {
return sessionFactory.openSession();
}
}
3 entity的变化:
package mars;
import java.io.Serializable;
import javax.persistence.*;
@Entity(name = "TUser")
public class User implements Serializable {
private static final long serialVersionUID = 1712116328170063667L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "userId")
private Long id = null;
@Column(name = "userName")
private String name = null;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4测试程序:
package mars;
public class HibernateDemo {
public static void main(String[] args) {
UserDAO userDAO = new UserDAO();
User user = new User();
user.setId(1l);
user.setName("eric");
userDAO.insert(user);
user = userDAO.find(new Long(1l));
System.out.println("name: " + user.getName());
}
}
package mars;
import org.hibernate.Hibernate;
import org.hibernate.Session;
public class UserDAO {
public void insert(User user) {
Session session = HibernateUtil.getSession();
session.save(user);
session.close();
}
public User find(Long id) {
Session session = HibernateUtil.getSession();
User flight = (User) session.load(User.class, id);
Hibernate.initialize(flight);
session.close();
return flight;
}
}
5 java要命的问题是包要加全加对
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="lib" path="lib/ejb3-persistence.jar"/> <classpathentry kind="lib" path="lib/hibernate3.jar"/> <classpathentry kind="lib" path="lib/hibernate-commons-annotations.jar"/> <classpathentry kind="lib" path="lib/hibernate-core.jar"/> <classpathentry kind="lib" path="lib/hibernate-annotations.jar"/> <classpathentry kind="lib" path="lib/mysql-connector-java-5.1.5-bin.jar"/> <classpathentry kind="lib" path="lib/dom4j.jar"/> <classpathentry kind="lib" path="lib/slf4j-api-1.5.2.jar"/> <classpathentry kind="lib" path="lib/slf4j-log4j12-1.5.2.jar"/> <classpathentry kind="lib" path="lib/commons-collections.jar"/> <classpathentry kind="lib" path="lib/log4j-1.2.15.jar"/> <classpathentry kind="lib" path="lib/cglib-nodep-2.1_3.jar"/> <classpathentry kind="lib" path="lib/javassist.jar"/> <classpathentry kind="lib" path="lib/jta.jar"/> <classpathentry kind="output" path="bin"/> </classpath>
6 tuser表
/*
MySQL Data Transfer
Source Host: localhost
Source Database: demo
Target Host: localhost
Target Database: demo
Date: 2009-3-30 0:08:39
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for tuser
-- ----------------------------
CREATE TABLE `tuser` (
`userId` bigint(20) NOT NULL AUTO_INCREMENT,
`userName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-- ----------------------------
-- Records
-- ----------------------------