`
yang2617
  • 浏览: 28654 次
社区版块
存档分类
最新评论

Hibernate ManyToMany

    博客分类:
  • java
阅读更多
对象之间的关系有多对一,一对多和多对多三种,现在我们主要分析一下多对多

先看实体类:

User
private int id;
private String username;
private Set<Role> roles;

@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public int getId() {
		return id;
	}

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

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

@ManyToMany
	@JoinTable(name = "userrole", joinColumns = { @JoinColumn(name = "userid") }, inverseJoinColumns = { @JoinColumn(name = "roleid") })
	public Set<Role> getRoles() {
		return roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}


Role
private int id;

	private String role;

	private Set<User> users;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public int getId() {
		return id;
	}

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

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	@ManyToMany(mappedBy = "roles")
	@JoinTable(name = "userrole", joinColumns = { @JoinColumn(name = "roleid") }, inverseJoinColumns = { @JoinColumn(name = "userid") })
	public Set<User> getUsers() {
		return users;
	}

	public void setUsers(Set<User> users) {
		this.users = users;
	}


我们来解释一下注解配置.
@ManyToMany:配置User和Role的关系为多对多.
@JoinTable(name = "userrole":配置关系表的名称
joinColumns = { @JoinColumn(name = "userid") }:关系表中与本实体对象关联的字段,本实体中的字段默认为id.完整的写法为
joinColumns = { @JoinColumn(name = "userid", referencedColumnName = "id") }
inverseJoinColumns = { @JoinColumn(name = "roleid") }关系表中与另外一个实体对象关联的字段
mappedBy = "roles":该配置表示由User中的roles来维护关系,即User中的roles变化时,关系表随着变化,而Role中的users变化是,关系表不随之改变.

Hibernate ManyToMany 默认为延迟加载,即查询User的时候默认不会查询roles.要同时查询出roles.需要用Criteria查询:

UserDao
public User getUserDetail(int id) {
		Criteria c = getSession().createCriteria(User.class);
		c.add(Restrictions.eq("id", id));
		c.setFetchMode("roles", FetchMode.JOIN);
		return (User) c.uniqueResult();
	}
3
3
分享到:
评论
3 楼 ganbo 2015-09-13  
2 楼 tcjakie 2014-10-17  
[img][/img][b][/b][i][/i][u][/u]
[url][/url][flash=200,200][/flash]
[img][/img]
引用
1 楼 suiyi_vs_yongyuan 2012-08-20  
@ManyToMany在一段配置,另一端直接mappedBy就可以了
这个多对多关系一段维护就可以了,两端都维护可能就会出问题了
也就是在Role 中直接mappedBy就好了,把@JoinTable(name = "userrole", joinColumns = { @JoinColumn(name = "roleid") }, inverseJoinColumns = { @JoinColumn(name = "userid") })删去

试试看

相关推荐

    hibernate中manytomany的例子

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,允许一个实体实例对应多个其他实体实例,反之亦然。本例子将深入探讨如何在Hibernate中设置并管理多对多关系。 首先,我们...

    hibernate5_ManyToMany多对多单向维护

    本文将详细讨论在Hibernate 5中如何实现ManyToMany单向维护的多对多关联。 首先,我们要理解多对多关联的基本概念。在数据库设计中,多对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联,反之亦然。...

    hibernatemanytomany:使用两个实体的投影Hibernate多对多示例

    问题:如何跨多对多关系的两个实体投影列示例:员工(id、名字、姓氏)会议(id、主题、会议日期) 假设我们有员工数据 1 , A, AA 2 , B, BB 会议 1,AB 会议,X 2,另一个会议,X 3,仅 B Employee_Meeting AB A 和...

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session...

    HIbernate-ManytoMany:HIbernate-ManytoMany 不同实体之间的关系

    本文将深入探讨如何在Hibernate中实现多对多(ManyToMany)的关系映射,以及相关的重要概念和技术细节。 在数据库设计中,多对多关系是最常见的一种关联类型,例如,一个学生可以选修多门课程,一门课程也可以被多...

    Hibernate 两种方式映射many to many

    在Hibernate中,我们可以通过`@ManyToMany`注解来定义这种关系,并使用`@JoinTable`注解来指定中间表的信息。例如: ```java @Entity public class Student { @Id @GeneratedValue(strategy = GenerationType....

    manytomany注解模式.rar

    在Java的持久化框架Hibernate中,`@ManyToMany`注解是用于处理数据库中的多对多(Many-to-Many)关系。多对多关系是指一个实体可以与多个其他实体相关联,反之亦然。这种关系在数据库表设计中通常通过中间表来实现,...

    manytomany关系

    在Java持久化框架Hibernate中,ManyToMany关系是一种重要的关联类型,它表示两个实体类之间可能存在多个实例互相关联的情况。例如,一个学生可以选修多门课程,一门课程也可以被多个学生选修,这就是典型的...

    hibernate-release-5.2.10

    7. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@ManyToMany)关系的映射,方便处理对象间的关联关系。 8. **延迟加载**:Hibernate的懒加载策略可以在需要时才...

    hibernate annotation hibernate3

    2. 关联注解:`@ManyToOne`, `@OneToMany`, `@OneToOne`, `@ManyToMany` 这些注解分别表示一对多、多对一、一对一和多对多的关系。例如,表示用户与角色的一对多关系: ```java @ManyToOne @JoinColumn(name=...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    - **多对多(ManyToMany)**: 多行记录对应数据库表的多个实体类实例。 **6. 缓存机制** - **一级缓存**: Session内的缓存,自动管理,无需额外配置。 - **二级缓存**: 应用级别的缓存,可选,可以通过插件如...

    hibernate_reference中文版和Hibernate中文手册

    7. 关联映射:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@ManyToMany)四种关系映射,以及级联操作(cascade)和懒加载(lazy)策略。 8. 自动更新和插入:Hibernate的自动...

    Hibernate帮助文档

    7. **关联映射**: Hibernate支持多种关联映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。理解这些关联类型以及它们的配置是掌握Hibernate的重要环节。 8. **...

    Hibernate多对多关联添加及查询示例

    `hibernate_manytomany_1.jpg`和`hibernate_manytomany_2.jpg`可能包含了多对多关联的配置或操作示意图,而`Hibernate_manytomanyTest.rar`和`accpDB.rar`则可能是相关的源代码或数据库文件,供学习者下载并运行测试...

    Hibernate 3.1.2中文文档

    10. **一对一(OneToOne)、一对多(OneToMany)、多对多(ManyToMany)关系映射**:Hibernate提供了多种关联映射方式,帮助处理复杂的数据关系。 11. **继承映射**:Hibernate支持单表继承、联合继承和表-per-...

    hibernate 重点知识原创

    Hibernate 支持多种数据库表之间的关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。通过 `&lt;one-to-one&gt;`、`&lt;list&gt;`、`&lt;set&gt;` 等元素可以定义这些关系,并指定...

    Hibernate 4.4.1最终发布版本

    例如,`@Entity`表示一个Java类对应数据库中的一个表,`@Table`定义表名,`@Id`标记主键,`@GeneratedValue`管理主键生成策略,`@ManyToOne`, `@OneToMany`, `@OneToOne`和`@ManyToMany`用于建立对象间的关联关系。...

    Hibernate手册中文版

    《Hibernate手册中文版》是Java开发领域中关于Hibernate框架的重要参考资料,它详尽地阐述了如何使用Hibernate进行对象关系映射(ORM)以及数据库交互。Hibernate作为一种强大的开源ORM框架,极大地简化了Java应用与...

    Hibernate In Action(Java.Persistence.with.Hibernate)源码

    3. **Entity实体**:了解@Entity、@Table、@Id等注解的用法,以及如何定义实体关系,如@ManyToOne、@OneToMany、@OneToOne和@ManyToMany。 4. **持久化操作**:学习使用Session的save()、saveOrUpdate()、update()、...

    HibernateDemo(hibernate基本用法演示)

    7. **级联操作**:通过 `@OneToMany`, `@ManyToOne`, `@ManyToMany` 等注解,可以配置实体之间的关联,并设置级联操作,如级联保存、删除等。 8. **缓存**:Hibernate 支持一级缓存(Session 缓存)和二级缓存,...

Global site tag (gtag.js) - Google Analytics