`
Luob.
  • 浏览: 1592134 次
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate 关系映射(二)基于中间表的N:1

阅读更多
1.单向 N:1 有中间表
例如:一个地方有多个人住.
     每个同学记住老师,比老师记住每个同学简单.
(在 n 的一端进行配置效率高)

N            1
Person   : Address
Student  : Teacher


注意:这次是有中间表
注意:比较 有无中间表的 配置,发现 采用 Join 和 many-to-one 进行配置
中间表


Person


Address



public class Address {
	private Integer aid;
	private String addressDetail;

        //set get ...
}

public class Person {

	private Integer pid;
	private String name;
	private int age;
	
	private Address address;  //单向(N:1)  反过来(1:1) 
	//set  get...
}


# person address N:1µÄ Öмä±í 
CREATE TABLE mytest.person_address
	(
	persson_id INT NOT NULL,
	address_id INT,
	PRIMARY KEY (persson_id),
	KEY FK23F8B90A67DFD9E4 (address_id),
	KEY FK23F8B90A5A57D6C9 (persson_id),
	CONSTRAINT FK23F8B90A5A57D6C9 FOREIGN KEY (persson_id) REFERENCES person (PID),
	CONSTRAINT FK23F8B90A67DFD9E4 FOREIGN KEY (address_id) REFERENCES address (AID)
	);

#Address
DROP TABLE IF EXISTS mytest.address;

CREATE TABLE mytest.address
	(
	AID         INT NOT NULL,
	ADDRESSDESC VARCHAR (255),
	PRIMARY KEY (AID)
	);
#Person	
DROP TABLE IF EXISTS mytest.person;

CREATE TABLE mytest.person
	(
	PID  INT NOT NULL,
	NAME VARCHAR (255),
	AGE  INT,
	PRIMARY KEY (PID)
	);

   <!--person-->
  <hibernate-mapping package="com.sh.study.model">
	<class name="Person" table="PERSON">
		<id name="pid" type="java.lang.Integer" column="PID">
			<generator class="increment"/>
		</id> 
		<property name="name" type="java.lang.String">
			<column name="NAME" />
		</property>
		<property name="age" type="int">
			<column name="AGE" />
		</property>
		
		<!-- Person 和 address 没有中间表的  N:1 配置  -->
		<!--name就是 Person中 的那个 address  
			cascade="all" 
		
		<many-to-one name="address" 
			class="Address" column="address_id">
		</many-to-one>
		-->
		
		<!-- person 和 address 有中间表的  N:1 配置   -->
		<join table="person_address">
			<key column="persson_id"/>
			<many-to-one name="address" cascade="all" class="Address" column="address_id"/>
		</join>
	</class>
</hibernate-mapping>


   <!--address-->
  <hibernate-mapping package="com.sh.study.model">
	<class name="Address" table="ADDRESS">
		<id name="aid" type="java.lang.Integer" column="AID">
			<generator class="increment"/>
		</id> 
		<property name="addressdesc" type="java.lang.String">
			<column name="ADDRESSDESC" />
		</property>
	</class>
</hibernate-mapping>

//test

public class TestHibernate {
	private ApplicationContext act;
	private SessionFactory factory;
	@Before
	public void init(){
		act = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
		factory= act.getBean("sessionFactory",SessionFactory.class);
	}
	//测试 无  五间表的 N:1 关系
	@Test
	public void test1() {
		Session session=factory.getCurrentSession();
		Transaction tx=session.beginTransaction();
		Person p=new Person();
		p.setAge(12);
		p.setName("Yeeku");
		Address address=new Address();
		address.setAddressdesc("北京海淀区");
		p.setAddress(address);

		//持久化对象
		session.persist(p);
		session.flush();
		tx.commit();
	
		//如果不是使用的SessionFactory.getSession()来获得Session。
		//而是使用SessionFactory.getCurrentSession()方法来获得Session时,
		//当事务结束的时候,不管是提交还是回滚事务,hibernate会自动关闭Session的,
		//session.close();
	}
	
	//测试 无  中间表的 N:1 关系
	@Test
	public void test2() {
		Session session=factory.getCurrentSession();
		Transaction tx=session.beginTransaction();
		Person p=new Person();
		p.setAge(12);
		p.setName("Yeeku");
		Address address=new Address();
		address.setAddressdesc("北京海淀区");
		p.setAddress(address);

		//持久化对象
		session.persist(p);
		//修改 Person的 地址 
		Address address1=new Address();
		address1.setAddressdesc("上海虹口");
		p.setAddress(address1);
		tx.commit();
	}
}


注意:cascade="all"
<!--如果Person配置-->
<hibernate-mapping package="com.sh.study.model">
	<class name="Person" table="PERSON">
		<id name="pid" type="java.lang.Integer" column="PID">
			<generator class="increment"/>
		</id> 
		<property name="name" type="java.lang.String">
			<column name="NAME" />
		</property>
		<property name="age" type="int">
			<column name="AGE" />
		</property>
		<!--如果少了 下面这个  
			cascade="all" 
		-->
		<many-to-one name="address" 
			class="Address" column="address_id">
		</many-to-one>
	</class>
</hibernate-mapping>


会出现异常:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.sh.study.model.Address


  • 大小: 20.9 KB
  • 大小: 28.4 KB
  • 大小: 35.1 KB
分享到:
评论

相关推荐

    Hibernate中的关联映射

    在多对多的情况下,需要在映射文件中指定中间连接表,以及如何在中间表中映射到关联类属性。 #### 三、总结 通过上述介绍,我们可以清楚地了解到Hibernate中不同类型的关联映射及其具体的映射方式。正确理解和使用...

    Hibernate课程

    - **对象关系映射(ORM)**:Hibernate是ORM框架的代表,它通过将Java对象与数据库中的表进行映射,使得开发者可以以面向对象的方式来操作数据库。 - **实体类与数据表**:理解如何定义Java实体类并将其映射到数据库...

    hibernate源码的学习

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。在Hibernate源码的学习过程中,我们可以深入理解ORM的工作原理,提高我们的Java开发技能,并且能够...

    hibernate-orm-master.zip

    Hibernate是一个开源的、基于Java的持久化框架,它提供了一种在Java应用和关系数据库之间建立映射的方法,使得开发者可以通过对象模型进行数据库操作,降低了数据库访问的复杂性。它的核心组件包括:Session、...

    hibernate 3.3 源码

    关联映射通过外键或中间表实现,允许对象间的复杂关系映射。 10. **延迟加载(Lazy Loading)** 延迟加载是一种优化策略,只有在真正需要时才加载关联的对象。这通常通过代理对象实现,避免了“n+1”查询问题,...

    J2EE电子商务系统开发从入门到精通:基于Struts和Hibernate技术实现

    通过XML文件或注解,Hibernate可以将Java对象映射到数据库表,实现对象和关系型数据之间的转换。 ##### Middlegen工具和hbm2java工具 这些工具可以自动生成实体类代码,减少手动编码的工作量。 #### 企业在线信息...

    Hibernate教程

    3. **Hibernate映射** 映射是将Java对象模型与数据库表结构对应的过程。Hibernate支持XML配置文件(hibernate.cfg.xml和.hbm.xml)和注解两种方式来定义映射关系。映射文件或注解中定义了实体类、属性、主键、关联...

    精通hibernate

    Hibernate是一个开源的ORM框架,它通过映射Java对象到关系数据库表,实现了对象与关系数据之间的无缝转换。这使得开发者可以专注于业务逻辑,而不必过多地关注底层的SQL操作。Hibernate支持多种数据库,如MySQL、...

    J2EE电子商务系统开发从入门到精通--基于Struts和Hibernate技术实现

    - Hibernate是一个面向对象的持久化框架,它通过ORM(Object Relational Mapping)的方式将对象模型映射到关系型数据库上。 - **3.2.2 重要jar文件介绍** - 包括Hibernate核心库、日志框架库、数据库驱动库等。 - ...

    SSH笔记-Mapping

    SSH(Struts2 + Spring + Hibernate)是Java开发中常用的一种Web应用开发框架组合,它结合了Struts的MVC设计模式、Spring的依赖注入和事务管理以及Hibernate的对象关系映射能力。本笔记主要探讨SSH中的映射关系,...

    精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例.doc

    - **情景1:不带应用程序服务器的Web服务器**:适用于简单的Web应用,其中Web服务器直接处理所有请求。 - **情景2:带应用程序服务器的Web服务器**:更复杂的应用通常会使用应用程序服务器来处理业务逻辑,而Web...

    《软件平台与中间技术》——复习资料.docx

    而Hibernate则是一个对象关系映射(ORM)框架,简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以避免编写大量的JDBC代码,提高开发效率和代码可维护性。 四、Message-Oriented Middleware (MOM) 和 ...

    java面试知识

    - **递归实现**:`n * factorial(n - 1)`。 ##### UE和UI的区别 - **UE (User Experience)**:用户体验设计,关注用户如何与产品交互。 - **UI (User Interface)**:用户界面设计,关注产品的外观和布局。 ##### ...

    java面试题广州

    Hibernate则用于ORM(对象关系映射)。 2. **Struts1与Struts2的区别**:Struts1基于Servlet API,使用ActionForm对象来封装请求参数;而Struts2则更现代,基于拦截器模型,支持更多功能,如类型转换、验证、国际化...

    J2EEWEB开发教程

    **2.3.1 情景1:不带应用程序服务器的Web服务器** 在这种情况下,Web服务器只能处理静态内容,无法处理动态内容。 **2.3.2 情景2:带应用程序服务器的Web服务器** 这种组合能够处理动态内容,例如通过Servlets和...

    J2EEWEB开发教材

    - **2.3.1 情景 1:不带应用程序服务器的 Web 服务器**:只能处理静态内容。 - **2.3.2 情景 2:带应用程序服务器的 Web 服务器**:能处理静态和动态内容。 **2.4 应用程序服务器示例** - **2.4.1 BEA Weblogic**:...

    (2024)跳槽涨薪必备精选面试题.pdf

    // 在这中间可以添加N行代码,但必须保证s引用的指向不变,最终将输出变成abcd System.out.println(s); } ``` **答案解析:** 1. **s1 == s2** 为 `false`。 - 这里假设 `s1` 和 `s2` 分别代表 `"abc"` 和通过 `...

Global site tag (gtag.js) - Google Analytics