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

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") })删去

试试看

相关推荐

Global site tag (gtag.js) - Google Analytics