1.建立Java工程项目hibenate_many2one,添加hibernate所需的Jar包和mysql驱动Jar包。
2.建立工具类HibernateUtils.java和ExportDB.java,代码如下:
HibernateUtils.java
- package com.i51pro.hibernate;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class HibernateUtils {
- private static SessionFactory sessionFactory;
- static {
- try {
- Configuration cfg = new Configuration().configure();
- sessionFactory = cfg.buildSessionFactory();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static SessionFactory getSessionFactory() {
- return sessionFactory;
- }
- public static Session getSession() {
- return sessionFactory.openSession();
- }
- public static void closeSession(Session session) {
- if (session != null) {
- if (session.isOpen()) {
- session.close();
- }
- }
- }
- }
ExportDB.java
- package com.i51pro.hibernate;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.tool.hbm2ddl.SchemaExport;
- public class ExportDB {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Configuration cfg = new Configuration().configure();
- SchemaExport export = new SchemaExport(cfg);
- export.create(true, true);
- }
- }
3.下面编写实体类和映射文件:
Group.java
- package com.i51pro.hibernate;
- public class Group {
- private int id;
- private String name;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
User.java
- package com.i51pro.hibernate;
- public class User {
- private int id;
- private String name;
- private Group group;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Group getGroup() {
- return group;
- }
- public void setGroup(Group group) {
- this.group = group;
- }
- }
Group.htm.xml
- <?xml version="1.0"?>
- <!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.i51pro.hibernate.Group" table="t_group">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- </class>
- </hibernate-mapping>
User.html.xml
- <?xml version="1.0"?>
- <!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.i51pro.hibernate.User" table="t_user">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <many-to-one name="group" column="groupid" cascade="all" />
- </class>
- </hibernate-mapping>
4.最后编写Hibernate映射文件:
- <!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.url">jdbc:mysql://localhost/hibernate_many2one</property>
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="hibernate.connection.username">root</property>
- <property name="hibernate.connection.password">admin</property>
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
- <property name="hibernate.show_sql">true</property>
- <mapping resource="com/i51pro/hibernate/User.hbm.xml"/>
- <mapping resource="com/i51pro/hibernate/Group.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
5.在项目hibernate_many2one下新建SourceFolder,命名为test,在该包下新建测试类Many2OneTest进行单元测试,,它的代码如下:
Many2OneTest
- package com.i51pro.hibernate;
- import org.hibernate.Session;
- import junit.framework.TestCase;
- public class Many2OneTest extends TestCase {
- public void testSave1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Group group = new Group();
- group.setName("JAVA开发小组");
- User user1 = new User();
- user1.setName("成员一");
- user1.setGroup(group);
- User user2 = new User();
- user2.setName("成员二");
- user2.setGroup(group);
- //不能成功保存,抛出TransientObjectException异常
- //因为Group为Tran sient状态,oid没有分配值
- //persistent状态的对象是不能引用transient状态的对象的
- session.save(user1);
- session.save(user2);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testSave2() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Group group = new Group();
- group.setName("JAVA开发小组");
- session.save(group);
- User user1 = new User();
- user1.setName("成员一");
- user1.setGroup(group);
- User user2 = new User();
- user2.setName("成员二");
- user2.setGroup(group);
- //可以正确存储
- session.save(user1);
- session.save(user2);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testSave3() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Group group = new Group();
- group.setName("JAVA开发小组");
- User user1 = new User();
- user1.setName("成员一");
- user1.setGroup(group);
- User user2 = new User();
- user2.setName("成员二");
- user2.setGroup(group);
- //不会抛出异常,因为采用了cascade属性,所以它会先保存Group
- //采用cascade属性是解决TransientObjectException异常的一种手段
- session.save(user1);
- session.save(user2);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testLoad1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- User user = (User)session.load(User.class, 3);
- System.out.println("user.name=" + user.getName());
- System.out.println("user.group.name=" + user.getGroup().getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }
总结:hibernate多对一关联映射关联映射的本质:
* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用
<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>
中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致
<many-to-one>标签的定义示例:
* <many-to-one name="group" column="groupid"/>