0 0

hibernate 复合主键 二级缓存 问题10

  大家好,对于hibernate二级缓存使用,以下使用情况,想请教一下:

 

  1. 使用复合主键

  2. 通过1对多关联获取相关的数据

 

  如“工作组” 与 “角色”的关系,一个工作组对应多个角色,而且工作组与角色的对应之间存在其它属性, 如描述等:

 

    工作组代码:

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "sys_work_group")
public class WorkGroup implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4016855062656988636L;
	@Id
	@Column(name = "workgroup_id", nullable = false)
	@GenericGenerator(name = "generator", strategy = "identity")
	@GeneratedValue(generator = "generator")
	private Integer workgroup_id;

	@OneToMany(cascade = { CascadeType.MERGE,CascadeType.REMOVE }, mappedBy = "workGroupRolePK.workGroup", targetEntity = WorkGroupRole.class, fetch = FetchType.LAZY)
	
	private Set<WorkGroupRole> workGroupRoles;

	@OneToMany(mappedBy = "workGroup",fetch=FetchType.LAZY)
	private Set<User> users;

	@Column(name = "name", nullable = false)
	private String name;

	@Column(name = "descri")
	private String descri;

	// 省略......
}

 

角色类代码:

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "sys_role")
public class Role implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 9055661647747413322L;

	@Id
	@Column(name = "roleid", nullable = false)
	//设置ID生成方式
	@GenericGenerator(name = "generator", strategy = "identity")
	//返回自增ID
	@GeneratedValue(generator = "generator")
	private Integer roleid;

	/**
	 * 角色名称
	 */
	@Column(name = "name", nullable = false)
	private String name;

	/**
	 * 排序ID
	 */
	@Column(name = "orderid")
	private Integer orderid;

	/**
	 * 备注
	 */
	@Column(name = "descri")
	private String descri;

	@ManyToMany(targetEntity = Menu.class, fetch = FetchType.LAZY)
	@JoinTable(name = "sys_role_menu", joinColumns = { @JoinColumn(name = "roleid") }, inverseJoinColumns = { @JoinColumn(name = "mid") })
	@Cache(region="cn.cpic.po.sys.Role.menus",usage=CacheConcurrencyStrategy.READ_WRITE)
	private Set<Menu> menus = new HashSet<Menu>();

	//@OneToMany(mappedBy = "role", fetch = FetchType.EAGER)
	@Transient
	private Set<User> users = new HashSet<User>();

	/**
	 * 用来保存资源与角色之间的映射关系
	 */
	@OneToMany(mappedBy = "roleResUrlPK.role", targetEntity = RoleResUrl.class, fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE })
	@Cache(region="cn.cpic.po.sys.RoleResUrl",usage=CacheConcurrencyStrategy.READ_WRITE)
	private Set<RoleResUrl> roleResUrls = new HashSet<RoleResUrl>();

	public void setRoleid(Integer roleid) {
		this.roleid = roleid;
	}
        //// 省略
}

 工作组与角色的对应类:

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "sys_workgroup_role")
public class WorkGroupRole implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5723834544769525469L;

	@Id
	@Cache(region="cn.cpic.po.sys.WorkGroupRole.workGroupRolePK",usage=CacheConcurrencyStrategy.READ_WRITE)
	private WorkGroupRolePK workGroupRolePK;

	@Column(name = "descri")
	private String descri;

	@Transient
	private boolean check;
        // getter and setter 省略

}

以及主键类@Embeddable
public class WorkGroupRolePK implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1572066453764922900L;

	@ManyToOne(targetEntity = WorkGroup.class, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
	@JoinColumn(name = "workgroup_id", nullable = false)
	private WorkGroup workGroup;

	@ManyToOne(targetEntity = Role.class, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
	@JoinColumn(name = "roleid", nullable = false)
	private Role role;

	public WorkGroupRolePK() {

	}

	public WorkGroupRolePK(WorkGroup workGroup, Role role) {
		this.setWorkGroup(workGroup);
		this.setRole(role);
	}
//// getter and setter 省略
	
	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof RoleResUrlPK)) {
			return false;
		}
		WorkGroupRolePK workGroupRolePK = (WorkGroupRolePK) obj;

		if ((workGroupRolePK.getRole() == null || this.role == null) || (workGroupRolePK.getWorkGroup() == null || this.getWorkGroup() == null)) {
			return false;
		}

		return (this.getRole().getRoleid() == workGroupRolePK.getRole().getRoleid()) && (this.getWorkGroup().getWorkgroup_id() == workGroupRolePK.getWorkGroup().getWorkgroup_id());
	}

	@Override
	public int hashCode() {
		int result = 51;
		result = 25 * result + (this.role == null ? result : this.role.getRoleid());
		result = 25 * result + (this.workGroup == null ? result : this.workGroup.getWorkgroup_id());
		return result;
	}

}

 

   代码如上配置后,当以下调用:

Set<WorkGroupRole> workGroupRoles = workGroup.getWorkGroupRoles();

if (!CollectionUtils.isEmpty(workGroupRoles)) {
	for (WorkGroupRole workGroupRole : workGroupRoles) {
              //............
        }
}

 

按我的理解,这里第二次调用应该是不会发出sql了的,但实际上,每一次调用都会发sql到数据库查询,不知道是我对hibernate二级缓存理解错了,还是配置,或者代码有不对,不知道哪位知道这其中的问题,谢谢~

Hibernate: select workgroupr0_.roleid as roleid29_0_, workgroupr0_.workgroup_id as workgroup3_29_0_, workgroupr0_.descri as descri29_0_ from sys_workgroup_role workgroupr0_ where workgroupr0_.roleid=? and workgroupr0_.workgroup_id=?
Hibernate: select workgroupr0_.roleid as roleid29_0_, workgroupr0_.workgroup_id as workgroup3_29_0_, workgroupr0_.descri as descri29_0_ from sys_workgroup_role workgroupr0_ where workgroupr0_.roleid=? and workgroupr0_.workgroup_id=?
.............................. 省略

 

 

2012年11月22日 15:29

2个答案 按时间排序 按投票排序

0 0

我也遇到这个问题,有没有最终的解决方案呢?

2015年7月24日 16:29
0 0

Set<WorkGroupRole> workGroupRoles = workGroup.getWorkGroupRoles();

if (!CollectionUtils.isEmpty(workGroupRoles)) {
for (WorkGroupRole workGroupRole : workGroupRoles) {
              //............
        }
}

你说的第二次调用指的是第二次调用上面的整个代码段?还是指的第二次for循环?

上面的代码段如果是第一次执行的话,肯定是要通过SQL从数据库中取数据的。
第二次执行上面的代码段的话,应该就会直接从缓存取数据了。

如果你说的是for循环的第二次的话,因为每次循环对应不同的数据,肯定要每次执行一个sql的。

2012年11月23日 08:15

相关推荐

    Hibernate学习笔记

    此外,Hibernate缓存机制(一级缓存和二级缓存)是性能优化的关键策略之一,它通过减少数据库的访问次数来提升性能。 继承关联映射允许在数据库表中存储继承关系,而component映射用于将复杂的对象分解成多个简单的...

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

    - **二级缓存**: 应用级别的缓存,可选,可以通过插件如Ehcache实现。 - **查询缓存**: 用于缓存查询结果,提高查询效率。 **7. 联合主键与复合主键** - 联合主键是多个字段共同构成的主键,可以通过@EmbeddedId和@...

    hibernate 3.6 中文 chm

    8. **缓存机制**:Hibernate提供了一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),能有效提高性能。同时,还支持第三方缓存服务如Ehcache。 9. **实体生命周期**:Hibernate管理对象的生命...

    hibernate源码分析过程

    Hibernate 源码分析过程 Hibernate 是一个基于 Java 的 ORM...Hibernate 的性能可以通过一级缓存和二级缓存来提高。一级缓存可以缓存对象的状态,二级缓存可以缓存查询结果。 Hibernate 也支持第三方缓存策略。

    精通hibernate

    Hibernate的缓存分为一级缓存(Session缓存)和二级缓存。一级缓存是默认开启的,每个Session都有自己的缓存,而二级缓存则可跨Session共享,提高性能。常用的二级缓存实现有Ehcache和Hibernate二进制树形缓存。 八...

    Hibernate3.6中文文档.rar

    Hibernate支持一级缓存(Session缓存)和二级缓存。一级缓存是默认开启的,每个Session都有自己的缓存,用于提高性能。二级缓存可以跨Session共享,通常由插件如EhCache提供,适用于读多写少的场景。 ### 八、实体...

    Hibernate高级特性

    Hibernate提供了第一级缓存和第二级缓存。第一级缓存是SessionFactory级别的,每个Session的操作都会被自动缓存,提高读取速度。第二级缓存则是可配置的,如Ehcache或Infinispan,能跨Session共享数据,进一步优化...

    hibernate5.2

    Hibernate 5.2在缓存方面也有所增强,包括第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存)。还支持查询缓存,能够显著提升查询效率。 六、性能优化 - 改进了连接池的配置和管理,支持更...

    Hibernate实战(第2版).pdf

    6. **缓存机制**:分析Hibernate的缓存策略,包括一级缓存和二级缓存,以及如何利用缓存提高性能。 7. **性能优化**:提供优化Hibernate应用的技巧,如延迟加载、批处理更新、预加载等策略,以及如何通过SQL优化来...

    hibernate-3.2 源码

    Hibernate 3.2引入了第一级缓存(Session级别)和第二级缓存(SessionFactory级别)。第一级缓存默认开启,提供高性能的本地缓存;第二级缓存可以通过插件如Ehcache实现,支持集群环境下的缓存共享。 七、高级特性 ...

    HibernateORM

    6.缓存机制:Hibernate提供了第一级缓存和第二级缓存,能有效提高数据访问性能。学习如何配置和使用缓存策略,可以避免不必要的数据库交互。 7. 数据库连接池:了解如何集成和配置数据库连接池,如C3P0、DBCP或...

    Hibernate 进阶教程

    8. **缓存机制**:探讨Hibernate的一级缓存和二级缓存,如何配置和使用,以及它们在性能优化中的作用。 9. **性能调优**:提供关于如何提高Hibernate性能的建议,如批处理、延迟加载、缓存策略调整等。 10. **其他...

    Hibernate5用户手册中文版

    为了提高性能,Hibernate支持二级缓存,分为Session级别的缓存和SessionFactory级别的缓存。常用的缓存提供商有Ehcache和Infinispan。缓存策略可以根据需求进行定制,比如查询结果缓存、集合缓存等。 **七、性能...

    Hibernate开发指南01

    6. **缓存机制**:介绍Hibernate的两级缓存(第一级缓存:Session缓存,第二级缓存:可选的外部缓存服务),以及查询缓存,提高数据访问性能。 7. **事务管理**:探讨Hibernate的事务处理,包括编程式事务管理和...

    hibernate-annotations-3.4.0.GA

    Hibernate提供了一级缓存(Session级别的)和二级缓存(SessionFactory级别的)。通过`@Cacheable`和`@Cache`注解可以配置实体的缓存策略,提高性能。 7. **转换器和类型** Hibernate支持自定义类型转换,通过`@...

    hibernate基础 入门/ hibernate basic

    6. **Composite Primary Key**:复合主键,用于标识表中的记录,当单一字段不足以唯一标识一条记录时使用。 **SessionFactory的作用**: - **创建Session实例**:SessionFactory负责创建Session实例,并管理这些...

    Java Persistence with Hibernate, 2nd Edition

    包括第一级缓存(Session级别)和第二级缓存(SessionFactory级别),以及查询缓存的使用和配置。 7. **性能优化**:作者会分享如何优化Hibernate应用,包括延迟加载、批处理更新、预加载关联对象等策略,以提高...

    JavaPersistenceWithHibernate

    此外,还涉及了性能优化技巧,如批处理(Batch Processing)、二级缓存和查询优化。 在实际开发中,本书还会介绍如何将Hibernate集成到Spring框架中,实现数据访问层(DAO)和业务逻辑层(Service)的解耦,以及...

    hibernate v3.04中文参考手册

    - 第二级缓存:SessionFactory级别的缓存,可配置第三方缓存实现,如EhCache。 - 查询缓存:缓存查询结果,提高效率。 9. **实体状态与生命周期** - 新建(Transient)、持久化(Persistent)、游离(Detached)...

    hibernate快速学习指南

    2. 缓存:提高性能,分为一级缓存(Session级别)和二级缓存(SessionFactory级别),可自定义实现第三方缓存服务。 七、事务处理 在Hibernate中,事务管理是非常关键的一部分,可以使用Transaction接口来控制事务...

Global site tag (gtag.js) - Google Analytics