-
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个答案 按时间排序 按投票排序
-
Set<WorkGroupRole> workGroupRoles = workGroup.getWorkGroupRoles();
if (!CollectionUtils.isEmpty(workGroupRoles)) {
for (WorkGroupRole workGroupRole : workGroupRoles) {
//............
}
}
你说的第二次调用指的是第二次调用上面的整个代码段?还是指的第二次for循环?
上面的代码段如果是第一次执行的话,肯定是要通过SQL从数据库中取数据的。
第二次执行上面的代码段的话,应该就会直接从缓存取数据了。
如果你说的是for循环的第二次的话,因为每次循环对应不同的数据,肯定要每次执行一个sql的。2012年11月23日 08:15
相关推荐
此外,Hibernate缓存机制(一级缓存和二级缓存)是性能优化的关键策略之一,它通过减少数据库的访问次数来提升性能。 继承关联映射允许在数据库表中存储继承关系,而component映射用于将复杂的对象分解成多个简单的...
- **二级缓存**: 应用级别的缓存,可选,可以通过插件如Ehcache实现。 - **查询缓存**: 用于缓存查询结果,提高查询效率。 **7. 联合主键与复合主键** - 联合主键是多个字段共同构成的主键,可以通过@EmbeddedId和@...
8. **缓存机制**:Hibernate提供了一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),能有效提高性能。同时,还支持第三方缓存服务如Ehcache。 9. **实体生命周期**:Hibernate管理对象的生命...
Hibernate 源码分析过程 Hibernate 是一个基于 Java 的 ORM...Hibernate 的性能可以通过一级缓存和二级缓存来提高。一级缓存可以缓存对象的状态,二级缓存可以缓存查询结果。 Hibernate 也支持第三方缓存策略。
Hibernate的缓存分为一级缓存(Session缓存)和二级缓存。一级缓存是默认开启的,每个Session都有自己的缓存,而二级缓存则可跨Session共享,提高性能。常用的二级缓存实现有Ehcache和Hibernate二进制树形缓存。 八...
Hibernate支持一级缓存(Session缓存)和二级缓存。一级缓存是默认开启的,每个Session都有自己的缓存,用于提高性能。二级缓存可以跨Session共享,通常由插件如EhCache提供,适用于读多写少的场景。 ### 八、实体...
Hibernate提供了第一级缓存和第二级缓存。第一级缓存是SessionFactory级别的,每个Session的操作都会被自动缓存,提高读取速度。第二级缓存则是可配置的,如Ehcache或Infinispan,能跨Session共享数据,进一步优化...
Hibernate 5.2在缓存方面也有所增强,包括第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存)。还支持查询缓存,能够显著提升查询效率。 六、性能优化 - 改进了连接池的配置和管理,支持更...
6. **缓存机制**:分析Hibernate的缓存策略,包括一级缓存和二级缓存,以及如何利用缓存提高性能。 7. **性能优化**:提供优化Hibernate应用的技巧,如延迟加载、批处理更新、预加载等策略,以及如何通过SQL优化来...
Hibernate 3.2引入了第一级缓存(Session级别)和第二级缓存(SessionFactory级别)。第一级缓存默认开启,提供高性能的本地缓存;第二级缓存可以通过插件如Ehcache实现,支持集群环境下的缓存共享。 七、高级特性 ...
6.缓存机制:Hibernate提供了第一级缓存和第二级缓存,能有效提高数据访问性能。学习如何配置和使用缓存策略,可以避免不必要的数据库交互。 7. 数据库连接池:了解如何集成和配置数据库连接池,如C3P0、DBCP或...
8. **缓存机制**:探讨Hibernate的一级缓存和二级缓存,如何配置和使用,以及它们在性能优化中的作用。 9. **性能调优**:提供关于如何提高Hibernate性能的建议,如批处理、延迟加载、缓存策略调整等。 10. **其他...
为了提高性能,Hibernate支持二级缓存,分为Session级别的缓存和SessionFactory级别的缓存。常用的缓存提供商有Ehcache和Infinispan。缓存策略可以根据需求进行定制,比如查询结果缓存、集合缓存等。 **七、性能...
6. **缓存机制**:介绍Hibernate的两级缓存(第一级缓存:Session缓存,第二级缓存:可选的外部缓存服务),以及查询缓存,提高数据访问性能。 7. **事务管理**:探讨Hibernate的事务处理,包括编程式事务管理和...
Hibernate提供了一级缓存(Session级别的)和二级缓存(SessionFactory级别的)。通过`@Cacheable`和`@Cache`注解可以配置实体的缓存策略,提高性能。 7. **转换器和类型** Hibernate支持自定义类型转换,通过`@...
6. **Composite Primary Key**:复合主键,用于标识表中的记录,当单一字段不足以唯一标识一条记录时使用。 **SessionFactory的作用**: - **创建Session实例**:SessionFactory负责创建Session实例,并管理这些...
包括第一级缓存(Session级别)和第二级缓存(SessionFactory级别),以及查询缓存的使用和配置。 7. **性能优化**:作者会分享如何优化Hibernate应用,包括延迟加载、批处理更新、预加载关联对象等策略,以提高...
此外,还涉及了性能优化技巧,如批处理(Batch Processing)、二级缓存和查询优化。 在实际开发中,本书还会介绍如何将Hibernate集成到Spring框架中,实现数据访问层(DAO)和业务逻辑层(Service)的解耦,以及...
- 第二级缓存:SessionFactory级别的缓存,可配置第三方缓存实现,如EhCache。 - 查询缓存:缓存查询结果,提高效率。 9. **实体状态与生命周期** - 新建(Transient)、持久化(Persistent)、游离(Detached)...
2. 缓存:提高性能,分为一级缓存(Session级别)和二级缓存(SessionFactory级别),可自定义实现第三方缓存服务。 七、事务处理 在Hibernate中,事务管理是非常关键的一部分,可以使用Transaction接口来控制事务...