运行环境:
·Eclipse oxygen
·MySQL 5.7
·Hibernate-release-5.2.16.Final
项目结构:
先新建一个user library,将所需的jar包导入
新建user类并声明为Hibernate持久化类
package user; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; //声明该类是一个Hibernate的持久化类 @Entity // 声明该类映射的表 @Table(name = "user") public class User { private String username; public int getId() { return id; } public void setId(int id) { this.id = id; } private String password; private String address; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
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 package="user"> <class name="User" table="user"> <id name="id" column="id"> <generator class="native" /> </id> <property name="username" column="username"></property> <property name="password" column="password"></property> <property name="address" column="address"></property> </class> </hibernate-mapping>
Hibernate配置文件hibernate.cfg.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 指定连接数据库所用的驱动 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 指定连接数据库的url,其中hibernate是本应用连接的数据库名 --> <property name="connection.url">jdbc:mysql://localhost/hibernate</property> <!-- 指定连接数据库的用户名 --> <property name="connection.username">root</property> <!-- 指定连接数据库的密码 --> <property name="connection.password">1111</property> <!-- 数据库方言 --> <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 根据需要自动创建数据表 --> <property name="hbm2ddl.auto">update</property><!--① --> <!-- 显示Hibernate持久化操作所生成的SQL --> <property name="hibernate.show_sql">true</property> <!-- 将SQL脚本进行格式化后再输出 --> <property name="hibernate.format_sql">true</property> <!-- 建立映射 --> <mapping resource="user/user.hbm.xml" /> </session-factory> </hibernate-configuration>
执行持久化操作的类UserManager.java
package manager; import user.User; import org.hibernate.*; import org.hibernate.service.*; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.*; public class UserManager { public static void main(String[] args) throws Exception { /* * 如果在hibernate5.x以下版本创建服务注册对象和会话工厂对象应该用的是如下的语句来创建,否则会报错。 Configuration * configure = new Configuration() .configure(); ServiceRegistry serviceRegistry * = new StandardServiceRegistryBuilder() * .applySettings(conf.getProperties()).build(); SessionFactory sessionFactory = * conf.buildSessionFactory(serviceRegistry); */ // 创建服务注册对象 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); // 创建会话工厂对象 SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); // 创建Session Session session = sessionFactory.openSession(); // 开始事务 Transaction tx = session.beginTransaction(); // 创建消息对象 User n = new User(); // 设置消息标题和消息内容 n.setUsername("nihao1"); n.setPassword("zz1"); n.setAddress("cn"); // 保存消息 session.save(n); // 提交事务 tx.commit(); // 关闭Session session.close(); sessionFactory.close(); } }
这里有一个小的地方需要注意一下,之前第一次写这个操作类的时候,,是用org.hibernate.cfg.Configuration这个对象来获取SessionFactory对象,实现方法如下代码:
Configuration conf = new Configuration() .configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build(); SessionFactory sessionFactory =conf.buildSessionFactory(serviceRegistry);
但是在实际操作的时候就会出现如下的错误:
Exception in thread "main" org.hibernate.MappingException: Unknown entity: user.User at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620) at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1635) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:691) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:683) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:678) at manager.UserManager.main(UserManager.java:33)
网上搜索了一下,应该是Hibernate自从5.x版本之后,改用了另外的一种方法来创建SessionFactory
// 创建服务注册对象 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); // 创建会话工厂对象 SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
更改后运行成功,创建了一个user的表,并且把字段存入了,结果如下:
https://github.com/homewin21/hibernate_1/