一个运行成功的hibernate例子(解决一直报hibernate mapping exception的错误)
按照****上教的,写个代码,结果一直报hibernate mapping exception的错误,查找各种资料配置,没有解决。最终发现,还是在sesstionfactory中,增加addClass(User.class);或者直接使用configuration.configure().buildSessionFactory();解决的。
容易错的地方,都标红加粗了。
hibernate版本:5.1.0. final。 jdk 1.8,myeclipse 2016 ci。
目录结构
一、hibernate.cfg.xml 连接数据库的配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/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.password">a</property>
<property name="connection.username">a</property>
<property name="connection.url">jdbc:mysql://localhost:3306/myhib</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="myeclipse.connection.profile">mysql</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="com/model/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
二、user.hbm.xml (hibernate映射文件的配置)
<!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.model.User" table="t_login">
<id name="id" type="int">
<column name="Id"/>
<generator class="native"/>
</id>
<property name="username" type="string" column="username"></property>
<property name="userpass" type="string" column="userpass"></property>
</class>
</hibernate-mapping>
三、HibernateSessionFactory的代码 (封装好的hiber操作)
package com.model;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateSessionFactory {
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal<Session> sessionThreadLocal = new ThreadLocal<Session>();//创建一个ThreadLocal<Session>对象用来存放当前Session对象
private static org.hibernate.cfg.Configuration configuration = new Configuration();
private static SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
static
{
try{
configuration.configure();//读取并解析hibernate.cfg.xml文件
//1.第一种方法
sessionFactory=configuration.configure().buildSessionFactory();
//2.第二种方法
//configuration.addClass(User.class);
//在Hibernate4.x后会使用***来解析映射信息,所以会先创建ServiceRegistry对象
//org.hibernate.service.ServiceRegistry svcreg=new org.hibernate.boot.registry.StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
//ServiceRegister对象作为参数,使用configuration对象创建sessionFactory对象,即将configuration对象里的信息copy到sessionFactory缓存中
//sessionFactory = configuration.buildSessionFactory(svcreg);
}catch(Exception e){
e.printStackTrace();
}
}
//声明一个私有无参构造函数
private HibernateSessionFactory(){}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static void rebuildSessionFactory(){
synchronized(sessionFactory){
try{
configuration.configure(configFile);
//configuration.addClass(User.class);
ServiceRegistry svcreg = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(svcreg);
//sessionFactory=configuration.configure().buildSessionFactory();
}catch(Exception e){
e.printStackTrace();
}
}
}
//打开session
public static Session getSession(){
//获取当前线程的session对象
Session session = sessionThreadLocal.get();
try{
if(session == null || !session.isOpen()){
if(sessionFactory == null){//如果sessionFactory为null,创建一个
rebuildSessionFactory();
}
//如果session没有打开,就用sessionFactory打开
session = (sessionFactory!=null)?sessionFactory.openSession():null;
//将session对象放到ThreadLocal对象里,以便使用
sessionThreadLocal.set(session);
}
}catch(Exception e){
e.printStackTrace();
}
return session;
}
public static void closeSession(){
Session session = sessionThreadLocal.get();
sessionThreadLocal.set(null);
try{
if(session != null && session.isOpen()){
session.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void setConfigFile(String configFile){
HibernateSessionFactory.configFile = configFile;
sessionFactory = null;
}
public static Configuration getConfiguration(){
return configuration;
}
}
另外,为项目添加hibernate能力的时候,会自动创建sessionfactory的代码,可参考。
下面是后来又一次参照视频,调用hibernate,插入数据库,实验成功的代码。hibernate也是用的5.1版本,myeclipse 2016。
public class UserTest {
public static void main(String[] args) {
Configuration cfg=new Configuration();
cfg.configure("/hibernate.cfg.xml"); //不要的话,会报错 'hibernate.dialect' not set
ServiceRegistry svr=new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
SessionFactory sf=cfg.buildSessionFactory();
Session ss=null;
try {
ss=sf.openSession();
ss.beginTransaction();
User user=new User();
user.setUsername("zhangsan");
user.setUserpass("000000");
user.setNickname("张三");
user.setBorn(new Date());
ss.save(user);
ss.getTransaction().commit();
} catch (HibernateException e) {
if(ss!=null) ss.getTransaction().rollback();
e.printStackTrace();
}finally {
if(ss!=null) ss.close();
}
}
}
成功结果:
Hibernate: create table t_user (id integer not null auto_increment, username varchar(255), userpass varchar(255), nickname varchar(255), born datetime, primary key (id))
Hibernate: insert into t_user (username, userpass, nickname, born) values (?, ?, ?, ?)
四、User实体类的代码
package com.model;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
@Entity
@javax.persistence.Table(name="_User")
public class User {
private int id;
private String username;
private String userpass;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
}
五、测试运行的代码testUser.java
package com.java;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.model.HibernateSessionFactory;
import com.model.User;
public class testUser {
public static void main(String[] a){
try {
System.out.println("1111111111111111........................");
SessionFactory sf=null;
sf=HibernateSessionFactory.getSessionFactory();
Session ss=sf.openSession();
System.out.println("222222222222222........................");
Transaction tran=ss.beginTransaction();
User u=new User();
u.setId(1);
u.setUsername("jxq");
u.setUserpass("123456");
System.out.println("33333333333333333........................");
ss.save(u);
System.out.println("44444444444444444444........................");
tran.commit();
//
System.out.println("66666........................");
ss.close();
sf.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("asdfad");
}
}
六、运行成功的结果
1111111111111111........................
三月 04, 2019 11:25:20 上午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.1.0.Final}
三月 04, 2019 11:25:20 上午 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
三月 04, 2019 11:25:20 上午 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
三月 04, 2019 11:25:20 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
三月 04, 2019 11:25:20 上午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead. Support for obsolete DTD/XSD namespaces may be removed at any time.
三月 04, 2019 11:25:20 上午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead. Support for obsolete DTD/XSD namespaces may be removed at any time.
三月 04, 2019 11:25:20 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
三月 04, 2019 11:25:20 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/myhib]
三月 04, 2019 11:25:20 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=a, password=****}
三月 04, 2019 11:25:20 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
三月 04, 2019 11:25:20 上午 org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
三月 04, 2019 11:25:21 上午 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
三月 04, 2019 11:25:21 上午 org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.2.4.Final
222222222222222........................
33333333333333333........................
Hibernate: insert into t_login (username, userpass) values (?, ?)
44444444444444444444........................
66666........................
三月 04, 2019 11:25:21 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/myhib]
asdfad