`

Hibernate的单向多对一

 
阅读更多

       最近研究Hibernate,试了一个数据库表项多对一的例子,结果给失败了。最后在网上找了一个博客看了看恍然大悟。启发我的这篇博客地址:http://blog.csdn.net/yinbodotcc/article/details/1505445

       现在总结几点,我认识的误区:

                               1,无需在数据库建表的时候指定外键,Hibernate可以将两张无外键关联的表通过xml映射出来。

                               2,不要过度依赖Eclipse的自动生成的*.java类和*.hbm.xml(和数据库表映射的类和对应的xml文件),虽然在数据库表中那个意义上的外键(无需再建表时指定)是int型的,而在自动生成的java文件中也是自动生成了Integer型的;但是,切记,一定要自己动手将其修改为那个依赖的类的类型。

                               3,<many-to-one>中的class一定要写依赖类的完整路径。

                               4,出现错误:

                                could not initialize proxy - no Session     的原因是:session已经关闭了。

现在上代码看看:

 

1,建立数据库:(无需指定外键)



 

2,自动生成映射类:

Room:

package com.wjy.models;

// Generated 2014-1-21 10:36:04 by Hibernate Tools 3.4.0.CR1

/**
 * Room generated by hbm2java
 */
public class Room implements java.io.Serializable {

	private Integer id;
	private String address;

	public Room() {
	}

	public Room(String address) {
		this.address = address;
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}

 User:

package com.wjy.models;

// Generated 2014-1-21 10:36:04 by Hibernate Tools 3.4.0.CR1

/**
 * User generated by hbm2java
 */
public class User implements java.io.Serializable {

	private Integer id;
	private String name;
	private Room room;       //注意这里,这里自动生成的是Integer,手动改成Room类型的。

	public User() {
	}

	public User(String name) {
		this.name = name;
	}

	public User(String name, Room room) {
		this.name = name;
		this.room = room;
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Room getRoom() {
		return room;
	}

	public void setRoom(Room room) {
		this.room = room;
	}


}

 

3,和2同时生成的   *.hbm.xml:

Room:

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-1-21 10:36:04 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.wjy.models.Room" table="room" catalog="multone">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="address" type="string">
            <column name="address" length="100" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

 User:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-1-21 10:36:04 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.wjy.models.User" table="user" catalog="multone">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="string">
            <column name="name" length="100" not-null="true" />
        </property>
        <many-to-one name="room" column="room_id" class="com.wjy.models.Room" cascade="all" outer-join="true">
	</many-to-one>   注意:这里修改了,不是自动生成的那个了。room是*.java中的,room_id是数据库表中的那个字段。
    </class>
</hibernate-mapping>

 

4,在hibernate.hbm.xml中添加映射:

<mapping class="com.wjy.models.Room" resource="com/wjy/models/Room.hbm.xml"/>
<mapping class="com.wjy.models.User" resource="com/wjy/models/User.hbm.xml"/>

 

5,现在可以看看测试代码了:

public void addUsers(){  
//向数据库user表中添加两个用户:Wjy和Yhw,他们是舍友。运行程序会发现,room表中竟然也自动添加了宿舍号的记录。
		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		//打开一个session实例
		Session session=sessionFactory.openSession();
		//开始事务
		Transaction transaction=session.beginTransaction();

		Room room1 = new Room();
		room1.setAddress("96#");

		User user1 = new User();
		user1.setName("Wjy");
		user1.setRoom(room1);////////////////////

		User user2 = new User();
		user2.setName("Yhw");
		user2.setRoom(room1);////////////////////
		
		
		//插入更新数据库
		session.save(user1);
		session.save(user2);
		//session.saveOrUpdate(model);
		transaction.commit();
		session.close();
	}

 看看数据库的变化:



 

6,目前为止实现了多对一的映射,而无需再数据库表中指定,很灵活。

public void getRoom(){

		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		//打开一个session实例
		Session session=sessionFactory.openSession();
		//开始事务
		Transaction transaction=session.beginTransaction();

		String hql="from User where name='Yhw'";
		Query userList=session.createQuery(hql);
		
		List list=userList.list();
		
		//User user = (User) session.load(User.class, new Integer(1));

		//transaction.commit();
		
	
		Iterator iterator=list.iterator();
		User user=(User)iterator.next();
		System.out.println(user.getName()+"   in   "+user.getRoom().getAddress());
		
		//System.out.println(user.getName()+"   in   "+user.getRoom().getAddress());
		
		session.close();
	}

 以上程序展示了两种查询到User的方式,被注释掉的是第二种方法。

我将我的源代码传上来,供大家参考。

分享到:
评论

相关推荐

    Hibernate学习:单向多对一关联 工程

    本项目“Hibernate学习:单向多对一关联 工程”专注于讲解Hibernate中的单向多对一关联映射,这是数据库设计中常见的关系类型,尤其在处理具有层次结构的数据时。 单向多对一关联指的是在一个实体类中有一个引用,...

    hibernate 单向多对多关联映射练习

    以上就是关于Hibernate单向多对多关联映射的基本介绍和实践。实际应用中,还需考虑性能优化、事务管理、懒加载等问题。通过不断的练习和学习,你可以更熟练地掌握这一重要功能,提升项目开发的效率和质量。

    hibernate单向多对多映射(XML版)

    本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...

    hibernate单向多对多映射(注解版)

    以下是对"hibernate单向多对多映射(注解版)"的详细解释。 首先,我们需要理解多对多关系的概念。在数据库设计中,多对多关系意味着一个实体可以与多个其他实体相关联,反之亦然。例如,学生和课程之间的关系就是多...

    hibernate多对一单向关联关系实现源码

    以上就是关于Hibernate中实现多对一单向关联关系的基本知识,包括如何在实体类中定义关联、如何进行数据库操作以及如何查询关联对象。这个源代码示例应该提供了更具体的实现细节,你可以通过查看和运行它来深入理解...

    hibernate单向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,单向一对多关联映射是常见的数据关系处理方式,尤其是在处理数据库中的实体类和表之间的关系时。本主题主要关注如何使用注解来实现这种映射。Hibernate通过注解使得对象关系映射...

    Hibernate 一对一外键单向关联

    本篇文章将深入探讨Hibernate中的一对一外键单向关联。 首先,一对一外键关联指的是一个实体通过外键直接引用另一个实体的主键。在单向关联中,只有其中一个实体知道另一个实体的存在,而另一个实体则无感知。这种...

    Hibernate单向一对多关联映射(XML版)

    在本主题"Hibernate单向一对多关联映射(XML版)"中,我们将深入探讨如何使用XML配置来实现数据库中一个实体类对应多个实体类的关联关系。 在Hibernate中,一对多关联是一种常见的关系映射类型,它反映了数据库中的...

    Hibernate基于外键的一对多单向关联

    “Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...

    Hibernate 系列教程 单向一对多

    本教程聚焦于Hibernate中的单向一对多关联映射,这是一个常见的实体关系模型,广泛应用于各种业务场景。 在数据库设计中,一对多关系意味着一个父表记录可以与多个子表记录相关联。例如,一个学生可以有多个课程,...

    hibernate5_ManyToMany多对多单向维护

    在处理多对多关联关系时,Hibernate提供了一种方便的方式来实现这种复杂的数据库关系。本文将详细讨论在Hibernate 5中如何实现ManyToMany单向维护的多对多关联。 首先,我们要理解多对多关联的基本概念。在数据库...

    hibernate 多对多全注解(单向关联、双向关联)

    hibernate关联映射注解多对多单向关联、

    hibernate一对一之唯一外键关联(单向关联)

    对于单向一对一关联,通常是在一个实体类中定义另一个实体类的引用,而另一个实体类并不知道这个引用。下面是一个简单的例子: ```java // 用户实体类(User) @Entity public class User { @Id @GeneratedValue...

    hibernate主键实现一对一单向关联关系源码

    -- 单向一对一关联Address --&gt; &lt;!-- Address.hbm.xml --&gt; &lt;param name="property"&gt;person&lt;/param&gt; &lt;!-- 引用Person的主键 --&gt; ``` 3. **源码分析** 在`Person`类中,`Address`对象的...

    Hibernate关于注解的一对多,多对多,一对一

    1. **@OneToOne** 注解:在单向一对一关系中,此注解用在主实体的属性上。而在双向一对一关系中,双方都需要`@OneToOne`,并使用`mappedBy`属性指定对方。 2. **@PrimaryKeyJoinColumn**:如果关联的两个实体使用...

    Hibernate基于连接表的一对多单向关联

    在上述代码中,我们使用了注解`@ManyToOne`和`@JoinColumn`来声明`Address`类中的`person`字段是一个多对一的关联,并指定了外键列的名称。 3. 数据库表结构:`personAdd.sql`可能包含了创建`Person`和`Address`表...

    hibernate多对多单向关联

    多对多单向关联 &lt;br&gt;需要注意映射规则: &lt;set name="users" table="t_user_role"&gt;&lt;br&gt; &lt;key column="roleid"/&gt;&lt;br&gt; &lt;many-to-many class="com.bjsxt.hibernate.User" column="userid"/&gt; &lt;/set&gt;

    Hibernate单向关联代码示例

    单向关联分为单向一对一关联和单向一对多关联。这里我们先讨论单向一对多关联,它是最常见的关联类型之一,一个实体可以拥有多个其他实体实例。例如,一个部门可以有多个员工,但员工并不知道属于哪个部门,这就是...

Global site tag (gtag.js) - Google Analytics