Hibernate 最简单例子
Hibernate 最简单例子
一 开发环境
Windows XP Pack 2
MyEclipse
jdk
Tomcat 5.0
MySQL Server 5.0
MySQL Tools for 5.0
二 开发代码
1 创建数据库,sql语句如下:
DROP TABLE IF EXISTS `test`.`user`;
CREATE TABLE `test`.`user` (
`id` int(10) unsigned NOT NULL auto_increment,
`username` varchar(64) NOT NULL,
`password` varchar(64) NOT NULL,
`first_name` varchar(128) NOT NULL,
`last_name` varchar(128) NOT NULL,
`date_created` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2 程序代码:
(1)hibernate.cfg.xml
package com.guoqiang.hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
/**
* Configures and provides access to Hibernate sessions, tied to the
* current thread of execution. Follows the Thread Local Session
* pattern, see {@link http://hibernate.org/42.html }.
*/
public class HibernateSessionFactory {
/**
* Location of hibernate.cfg.xml file.
* Location should be on the classpath as Hibernate uses
* #resourceAsStream style lookup for its configuration file.
* The default classpath location of the hibernate config file is
* in the default package. Use #setConfigFile() to update
* the location of the configuration file for the current session.
*/
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
static {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err
.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
private HibernateSessionFactory() {
}
/**
* Returns the ThreadLocal Session instance. Lazy initialize
* the <code>SessionFactory</code> if needed.
*
* @return Session
* @throws HibernateException
*/
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}
return session;
}
/**
* Rebuild hibernate session factory
*
*/
public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err
.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
/**
* Close the single hibernate session instance.
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
/**
* return session factory
*
*/
public static org.hibernate.SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* return session factory
*
* session factory will be rebuilded in the next call
*/
public static void setConfigFile(String configFile) {
HibernateSessionFactory.configFile = configFile;
sessionFactory = null;
}
/**
* return hibernate configuration
*
*/
public static Configuration getConfiguration() {
return configuration;
}
}
(2)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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.guoqiang.hibernate.User" table="user" catalog="test">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="assigned" />
</id>
<property name="username" type="java.lang.String">
<column name="username" length="64" not-null="true" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="64" not-null="true" />
</property>
<property name="firstName" type="java.lang.String">
<column name="first_name" length="128" not-null="true" />
</property>
<property name="lastName" type="java.lang.String">
<column name="last_name" length="128" not-null="true" />
</property>
<property name="dateCreated" type="java.lang.Long">
<column name="date_created" not-null="true" />
</property>
</class>
</hibernate-mapping>
(3)AbstractUser.java
package com.guoqiang.hibernate;
/**
* AbstractUser generated by MyEclipse Persistence Tools
*/
public abstract class AbstractUser implements java.io.Serializable {
// Fields
private Integer id;
private String username;
private String password;
private String firstName;
private String lastName;
private Long dateCreated;
// Constructors
/** default constructor */
public AbstractUser() {
}
/** full constructor */
public AbstractUser(Integer id, String username, String password,
String firstName, String lastName, Long dateCreated) {
this.id = id;
this.username = username;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
this.dateCreated = dateCreated;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Long getDateCreated() {
return this.dateCreated;
}
public void setDateCreated(Long dateCreated) {
this.dateCreated = dateCreated;
}
}
(4)User.java
package com.guoqiang.hibernate;
// Generated by MyEclipse Persistence Tools
/**
* User generated by MyEclipse Persistence Tools
*/
public class User extends AbstractUser implements java.io.Serializable {
// Constructors
/** default constructor */
public User() {
}
/** full constructor */
public User(Integer id, String username, String password, String firstName,
String lastName, Long dateCreated) {
super(id, username, password, firstName, lastName, dateCreated);
}
}
(5)DemoHibernateTest.java
package com.guoqiang.hibernate;
import org.hibernate.Transaction;
public class DemoHibernateTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
addUser();
listUser();
changeUser();
}
private static void printUser(String extraText, User user) {
System.out.println(extraText
+ "User[Username: "
+ user.getUsername()
+ ", Password:"
+ user.getPassword()
+ ",First Name: "
+ user.getFirstName()
+ ",Last Name: "
+ user.getLastName()
+ "]");
}
private static void addUser() {
// Create user
User user = new User();
user.setId(1);
user.setUsername("guoqiang");
user.setFirstName("guo");
user.setLastName("qiang");
user.setPassword("guoqiang");
user.setDateCreated(System.currentTimeMillis());
// Create DAO
UserDAO dao = new UserDAO();
// Start the transaction
Transaction tx = dao.getSession().beginTransaction();
// Add user
dao.save(user);
// Commit the transaction
tx.commit();
// Close the session
dao.getSession().close();
}
private static void listUser() {
UserDAO dao = new UserDAO();
User user = dao.findById(1);
printUser("Pringting User, ", user);
dao.getSession().close();
}
private static void changeUser() {
UserDAO dao = new UserDAO();
User user = dao.findById(1);
user.setUsername("test");
user.setPassword("test");
user.setFirstName("demo");
user.setLastName("demo");
Transaction tx = dao.getSession().beginTransaction();
// Add user
dao.save(user);
// Commit the transaction
tx.commit();
User updateUser = dao.findById(1);
printUser("Pringting Updated User, ", updateUser);
dao.getSession().close();
}
}
三 运行结果如下:
Pringting User, User[Username: guoqiang, Password:guoqiang,First Name: guo,Last Name: qiang]
Pringting Updated User, User[Username: test, Password:test,First Name: demo,Last Name: demo]
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
四 存在问题和解决
问题1:hibernate.cfg.xml文件找不到 如下:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
org.hibernate.HibernateException: /hibernate.cfg.xml not found
at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:147)
at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:1287)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1309)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1296)
at com.hibernate.DemoHibernateTest.main(DemoHibernateTest.java:15)
解决:1 在Create a Java project时,一定要选Project layout中的Create separate source and output foldedrs 解决找不到hibernate.cfg.xml
2 在src下在创建log4j.properties 解决log4j:WARN
内容为:
log4j.rootLogger=debug, A1 , R
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m -(:%L)%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=D:/workspace/DemoHibernate/HibernateDemoLog.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m -(:%L)%n
修改DemoHibernateTest.java如下:
public class DemoHibernateTest {
private static Logger log =Logger.getLogger(DemoHibernateTest.class);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
log.debug("------测试!----");
//addUser();
listUser();
changeUser();
}
//省略
}
运行就会在Console输出log,选中工程DemoHibernate,刷新就会看到HibernateDemoLog.log 内容如下(节选):
2007-06-16 11:25:33 [com.guoqiang.hibernate.DemoHibernateTest]-[DEBUG] ------测试!---- -(:14)
//省略
2007-06-16 11:41:31 [org.hibernate.impl.SessionImpl]-[DEBUG] after transaction completion -(:417)
Pringting Updated User, User[Username: test, Password:test,First Name: demo,Last Name: demo]//输出内容!!!!
2007-06-16 11:41:31 [org.hibernate.impl.SessionImpl]-[DEBUG] closing session -(:268)
2007-06-16 11:41:31 [org.hibernate.jdbc.ConnectionManager]-[DEBUG] connection already null in cleanup : no action -(:369)
五 参考资料
1 《Introduction to Hibernate Tutorial》
http://www.myeclipseide.com/images/tutorials/quickstarts/introduction_to_hibernate/tutorial.html
2 《最简单的Log4j使用》
3 《First Hibernate example》
http://www.laliluna.de/download/first-hibernate-example-tutorialen.pdf出处:http://www.cnblogs.com/dbasys/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。