Hibernate <many to one> & <one to many>

本文介绍如何使用Hibernate框架实现多对一和一对多的数据库关联,并提供了详细的Java代码示例,包括实体类定义、映射文件及配置。

说明:这个例子只是简单的把两个表作了单向多对一和单向一对多关联。可以实现数据的检索,但是在删除和更新上尚有问题,之后再讨论。

 

一、数据库

 

 

 

 

 

二、编码

 

目录结构

 

 

 

 

1、建立两个类:User、Team

package jlp.hibernate;

 

public class User {

private int User_Id;

private String User_Name;

private Team Team;

 

public int getUser_Id() {

return User_Id;

}

public void setUser_Id(int user_Id) {

User_Id = user_Id;

}

public String getUser_Name() {

return User_Name;

}

public void setUser_Name(String user_Name) {

User_Name = user_Name;

}

public Team getTeam() {

return Team;

}

public void setTeam(Team team) {

Team = team;

}

}

 

 

---------------------------------------------------------------------------------------

 

package jlp.hibernate;

 

import java.util.HashSet;

import java.util.Set;

 

public class Team {

private int Team_Id;

private String Team_Name;

private Set<User> Users=new HashSet<User>();

 

public Team()

{

 

}

public Team(String Team_Name)

{

this.Team_Name=Team_Name;

}

public int getTeam_Id() {

return Team_Id;

}

public void setTeam_Id(int team_Id) {

Team_Id = team_Id;

}

public String getTeam_Name() {

return Team_Name;

}

public void setTeam_Name(String team_Name) {

Team_Name = team_Name;

}

public Set<User> getUsers() {

return Users;

}

public void setUsers(Set<User> users) {

Users = users;

}

}

 

2、对应实体类新建两个映射文件:User.hbm.xml、Team.hbm.xml

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

                                   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="jlp.hibernate">

 <class name="jlp.hibernate.User" table="User">

  <id column="User_Id" name="User_Id">

   <generator class="increment"/>

  </id>

  <property column="User_Name" generated="never" lazy="false" name="User_Name"/>

  <many-to-one cascade="delete" class="jlp.hibernate.Team" column="Team_Id"

   lazy="false" name="Team"/>

 </class>

</hibernate-mapping>

 

------------------------------------------------------------------------------------------

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

                                   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="jlp.hibernate">

 <class name="jlp.hibernate.Team" table="Team">

  <id column="Team_Id"  name="Team_Id">

   <generator class="increment"/>

  </id>

  <property column="Team_Name"  name="Team_Name" />

  <set name="Users" lazy="false">

      <key column="Team_Id"></key>

      <one-to-many class="jlp.hibernate.User"/>

  </set>

 </class>

</hibernate-mapping>

 

3、Hibernate配置文件

 

<?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">

 

<hibernate-configuration>

 

<session-factory>

 

<!-- Database connection settings -->

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="connection.url">jdbc:mysql://127.0.0.1:3306/test</property>

<property name="connection.username">root</property>

<property name="connection.password" >root</property>

 

<!-- JDBC connection pool (use the built-in) -->

<property name="connection.pool_size">1</property>

 

<!-- SQL dialect -->

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

 

<!-- Disable the second-level cache  -->

<property name="cache.provider_class">

org.hibernate.cache.internal.NoCacheProvider

</property>

 

<!-- Echo all executed SQL to stdout -->

<!-- 是否在控制台显示操作的SQL代码 -->

<property name="show_sql">true</property>

 

<!-- Drop and re-create the database schema on startup -->

<!-- 重启服务器的时候怎么操作数据库:create、update、 -->

<property name="hbm2ddl.auto">create</property>

<property name="myeclipse.connection.profile">

com.mysql.jdbc.Driver

</property>

 

<mapping resource="jlp/hibernate/User.hbm.xml" />

<mapping resource="jlp/hibernate/Team.hbm.xml" />

 

</session-factory>

 

</hibernate-configuration>

</hibernate-configuration>

 

4、编写测试文件

package jlp.hibernate;

import java.util.Iterator;

 

public class Test {

 

public static void main(String[] args) {

BaseHibernateDao dao=new BaseHibernateDao();

Team team=new Team("软工1001B");

dao.add(team);

int i;

for(i=0;i<5;i++)

{

User user=new User();

user.setUser_Name("张三"+i);

user.setTeam((Team)dao.get(Team.class,1));

dao.add(user);

}

User u=(User)dao.get(User.class, 1);

System.out.println(u.getTeam().getTeam_Name());

Team t=(Team)dao.get(Team.class, 1);

Iterator<User> iter=t.getUsers().iterator();

while(iter.hasNext())

{

u=(User)iter.next();

System.out.println(u.getUser_Id()+"   "+u.getUser_Name()+"  "+u.getTeam().getTeam_Name());

}

//dao.delete(user);

}

}

 

 

5、BaseHibernateDao.java

package jlp.hibernate;

 

import java.io.Serializable;

 

import org.hibernate.Session;

import org.hibernate.Transaction;

 

public class BaseHibernateDao {

/*

 * 添加数据

 * @param object

 *

 */

protected void add(Object object)

{

Transaction tx=null;

Session session=HibernateSessionFactory.getSession();

try

{

tx=session.beginTransaction();

session.save(object);

tx.commit();

}

catch (Exception e)

{

if(tx!=null) tx.rollback();

System.out.println("BaseHibernateDao:add(Object object)    false!");

}

finally

{

session.close();

}

}

 

/*

 * 加载数据

 * @param cla

 * @param id

 * @return

 */

@SuppressWarnings("rawtypes")

protected Object get(Class cla,Serializable id)

{

Object object=null;

Session session=HibernateSessionFactory.getSession();

try

{

object=session.get(cla, id);

}

catch (Exception e)

{

System.out.println("BaseHibernateDao:get(Class cla,Serializable id)    false!");

}

finally

{

session.close();

}

return object;

}

 

/*

 * 删除数据

 * @param object

 */

protected void delete(Object object)

{

Transaction tx=null;

Session session=HibernateSessionFactory.getSession();

try

{

tx=session.beginTransaction();

session.delete(object);

tx.commit();

}

catch (Exception e)

{

if(tx!=null) tx.rollback();

System.out.println("BaseHibernateDao:delete(Object object)    false!");

}

finally

{

session.close();

}

}

 

/*

 * 修改数据

 *@param object

 */

protected void update(Object object)

{

Transaction tx=null;

Session session=HibernateSessionFactory.getSession();

try

{

tx=session.beginTransaction();

session.update(object);

tx.commit();

}

catch (Exception e)

{

if(tx!=null) tx.rollback();

System.out.println("BaseHibernateDao:update(Object object)    false!");

}

finally

{

session.close();

}

}

 

public static void main(String[] args) {

 

}

 

}

6、HibernateSessionFactory.java

package jlp.hibernate;

 

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.cfg.Configuration;

import org.hibernate.service.ServiceRegistry;

import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateSessionFactory {

 

    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);

ServiceRegistry serviceRegister=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();

sessionFactory = configuration.buildSessionFactory(serviceRegister);

} catch (Exception e) {

System.out.println("%%%% Error Creating SessionFactory %%%%");

e.printStackTrace();

}

    }

    private HibernateSessionFactory() {

    }

 

 

    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;

    }

 

public static void rebuildSessionFactory() {

try {

configuration.configure(configFile);

ServiceRegistry serviceRegister=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();

sessionFactory = configuration.buildSessionFactory(serviceRegister);

} catch (Exception e) {

System.out.println("%%%% Error Creating SessionFactory %%%%");

e.printStackTrace();

}

}

    public static void closeSession() throws HibernateException {

        Session session = (Session) threadLocal.get();

        threadLocal.set(null);

 

        if (session != null) {

            session.close();

        }

    }

 

public static org.hibernate.SessionFactory getSessionFactory() {

return sessionFactory;

}

 

 

public static void setConfigFile(String configFile) {

HibernateSessionFactory.configFile = configFile;

sessionFactory = null;

}

 

public static Configuration getConfiguration() {

return configuration;

}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/JingLupeng/archive/2013/04/10/3012884.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值