`
zy77612
  • 浏览: 283478 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

双向关联

JPA 
阅读更多
  1. One-To-One  

    

@Entity
public class Customer implements Serializable {
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="passport_fk")
    public Passport getPassport() {
        ...
    }

@Entity
public class Passport implements Serializable {
    @OneToOne(mappedBy = "passport")
    public Customer getOwner() {
    ...
}

 

在双向关联中, 有且仅有一端是作为主体(owner)端存在的:主体端负责维护联接列(即外键FK). 对于不需要维护这种关系的从表则通过mappedBy属性进行声明. mappedBy的值指向主体的关联属性. 在上面这个例子中,mappedBy的值为 passport. 最后,不必也不能再在被关联端(owned side)定义联接列了,因为已经在主体端进行了声明.如果在主体没有声明@JoinColumu,系统自动进行处理: 在主表(owner table)中将创建联接列, 列名为:主体的关联属性名+下划线+被关联端的主键列名. 在上面这个例子中是passport_id, 因为Customer中关联属性名为passport, passport的主键是id.

 

注意:

    只要有双向关联关系,必设mppedBy

    ManyToOne关系中默认的fetch是 FetchType.EAGER

    OneToMany关系中默认的fetch是 FetchType.LAZY

 

 

 

数据库中的一个树结构,对象的表现形式.

 

 

@Entity
public class TreeObject {
	
	private int id;
	private String name;
	private TreeObject parent;
	private List<TreeObject> children = new ArrayList<TreeObject>();


	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	@ManyToOne
	@JoinColumn(name="parent_id")	
	public TreeObject getParent() {
		return parent;
	}
	@OneToMany(cascade=CascadeType.ALL,mappedBy="parent")
	@OrderBy("name ASC")
	public List<TreeObject> getChildren() {
		return children;
	}
        ....................

 

生成的表结构:

 

 

 create table TreeObject (
        id integer not null auto_increment,
        name varchar(255),
        parent_id integer,
        primary key (id)
    )

    alter table TreeObject 
        add index FK95A4309DA50A61ED (parent_id), 
        add constraint FK95A4309DA50A61ED 
        foreign key (parent_id) 
        references TreeObject (id)

 

 

    ManyToOne和OneToMany双向关系上,在OneToMany端设置mappedBy,表示主体端是Many端,关系的主导是One端的getChildren集合中的TreeObject的parent对象负责维持关系,也就是说我们用下面的方法就可以保存这些关系.

 

	@Test
	public void testSaveTreeObject() {
		TreeObject o = new TreeObject();
		o.setName("总公司");
		TreeObject o1 = new TreeObject();
		o1.setName("分公司1");
		TreeObject o2 = new TreeObject();
		o2.setName("分公司2");		
		o1.setParent(o);
		o2.setParent(o);
		Session s = sessionFactory.openSession();
		s.beginTransaction();
		s.save(o);
		s.save(o1);
		s.save(o2);
		s.getTransaction().commit();
		s.close();
	}

 

这段代码和上面的效果是一样的,因为@OneToMany(cascade=CascadeType.ALL,mappedBy="parent"),
CascadeType.ALL保存parent对象时,children也跟着保存了.

	@Test
	public void testSaveTreeObject() {
		TreeObject parent = new TreeObject();
		parent.setName("总公司");
		TreeObject child1 = new TreeObject();
		child1.setName("分公司1");
		TreeObject child2 = new TreeObject();
		child2.setName("分公司2");		
		child1.setParent(parent);
		child2.setParent(parent);
		parent.getChildren().add(child1);
		parent.getChildren().add(child2);
		Session s = sessionFactory.openSession();
		s.beginTransaction();
		s.save(parent);
		s.getTransaction().commit();
		s.close();
	}

 

  

数据库表中生成三条记录:

id     name       parent_id

1      总公司      null

2      分公司1    1

3      分公司2    1

 

 

 

分享到:
评论

相关推荐

    hibernate多对多双向关联

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

    13_jpa多对多双向关联实体定义与注解

    本篇将详细讲解JPA中的一个关键概念——多对多双向关联,并通过实体定义与注解设置来深入理解这一特性。"13_传智播客JPA详解"系列教程涵盖了JPA的诸多方面,而"13_传智播客JPA详解_JPA中的多对多双向关联实体定义与...

    Hibernate ORM - 一对多双向关联关系

    标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...

    多对多双向关联

    在编程领域,尤其是在Java或Spring框架中,"多对多双向关联"是一个常见的数据库关系映射概念。在数据库设计中,关系模型允许实体之间存在多种联系,而多对多关联是最复杂也是最灵活的一种关系类型。它表示一个实体...

    多对一双向关联关系实现源码

    本篇文章将详细讲解如何在Hibernate中实现多对一双向关联关系,并通过源码分析加深理解。 多对一关联关系是指在数据库中,一个实体(表)可以与多个其他实体(表)相关联,而另一个实体则对应于前者的多个实例。...

    Hibernate一对一主键关联映射(双向关联)

    "双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,同时在实体B中也有一个对实体A的引用。 在实际配置中,我们可以使用以下元素来实现这种映射: 1. `@OneToOne`:...

    JPA中的一对一双向关联

    在Java Persistence API (JPA) 中,一对一双向关联是一种关系映射,它允许两个实体类之间存在一对一的关系,并且每个实体都能引用对方。这种关联是双向的,意味着每个实体都可以通过自己的属性访问到另一个实体。...

    hibernate表之间3种双向关联映射

    本篇文章将详细探讨三种常见的双向关联映射方式:双向多对多(BidirectionalManyToMany)、双向一对多(BidirectionalOneToMany)以及双向一对一(BidirectionalOneToOne),包括它们的概念、配置和实际应用。...

    mybatis系列三:一对多双向关联

    在MyBatis系列的第三部分,我们将深入探讨“一对多双向关联”的概念及其实现方法。 首先,理解“一对多”关联是关键。在数据库设计中,这种关系表示一个实体(如订单)可以与多个其他实体(如订单中的商品)相关联...

    ios-双向关联TableView.zip

    在“ios-双向关联TableView.zip”这个压缩包中,包含的示例项目"ZHFTableViewOfTableView"很可能是为了演示如何实现两个UITableView之间的交互和数据同步,这种设计模式通常被称为双向关联表格视图。这种模式在需要...

    JPA中的多对多双向关联实体定义与注解设置

    总结来说,JPA中的多对多双向关联实体定义涉及`@ManyToMany`、`@JoinTable`以及`mappedBy`等注解的使用。正确配置这些注解可以让我们轻松地管理实体之间的复杂关系,并简化数据库操作。在实际项目中,理解并熟练掌握...

    JPA中的一对多双向关联与级联操作

    这篇博客将深入探讨JPA中的一对多双向关联以及级联操作。 首先,让我们理解一对多关联。假设我们有两个实体,一个是`User`(用户)和一个是`Post`(帖子)。一个用户可以发布多个帖子,但一个帖子只能属于一个用户...

    JPA学习总结(二)--JPAOneToOne双向关联

    总的来说,JPA的`@OneToOne`注解提供了处理一对一关联的强大工具,尤其是在处理双向关联时。正确理解和使用这些关联,能够帮助我们更好地进行对象与数据库之间的映射,提高代码的可读性和维护性。在实际项目中,应...

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

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

    一对一双向关联映射

    在Java持久化框架Hibernate中,一对一双向关联映射是一种重要的数据对象关系映射策略,它允许我们在数据库中的两个实体之间建立一对一的关系,并且在Java对象模型中可以从任一侧访问另一侧的对象。这种映射方式增加...

    Hibernate双向关联代码示例

    **Hibernate双向关联详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本示例将深入探讨Hibernate中的双向关联,这是一种常见且重要的数据模型映射技术。 双向关联...

    Hibernate一对一唯一外键关联映射(双向关联)

    本篇将详细讲解如何使用Hibernate实现一对一唯一外键(Unique Foreign Key)关联映射,并以双向关联为例进行深入探讨。 一、Hibernate一对一关联类型 一对一关联在现实世界中很常见,例如一个人只有一个身份证,一...

    hibernate关联关系之一对一双向关联

    在Java持久化框架Hibernate中,一对一双向关联是一种常见的实体关系映射,它反映了数据库中的两个表之间一对一的对应关系。这种关联关系可以是单向的,也可以是双向的,而这里的"hibernate关联关系之一对一双向关联...

    hibernate一对多关联映射(双向关联)

    在本篇文章中,我们将深入探讨如何实现双向关联的一对多映射,以及在实际应用中可能会遇到的问题和解决方案。 首先,我们需要了解什么是双向关联。在Hibernate的一对多关联中,双向关联意味着双方都可以通过导航...

Global site tag (gtag.js) - Google Analytics