【发布时间】:2017-12-27 22:36:59
【问题描述】:
我正在尝试 Spring Boot 和 Hibernate 二级缓存。我成功地让它工作了。但是,我遇到了一个奇怪的场景,如果 ID 列是 VARCHAR,则不会从二级缓存中获取实体。以下是相关类:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "user1")
@Entity
public class User {
private long userId;
private String name;
@Id
@Column(name = "id")
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public User() {
}
}
这个实体工作正常,这里是来自 hibernate 的第一次和第二次获取的调试日志
获取 1
o.h.e.t.internal.TransactionImpl : begin
org.hibernate.SQL : select user0_.id as id1_1_0_, user0_.name as name2_1_0_ from user1 user0_ where user0_.id=?
o.h.l.p.e.p.i.ResultSetProcessorImpl : Starting ResultSet row #0
l.p.e.p.i.EntityReferenceInitializerImpl : On call to EntityIdentifierReaderImpl#resolve, EntityKey was already known; should only happen on root returns with an optional identifier specified
o.h.engine.internal.TwoPhaseLoad : Resolving associations for [com.voyant.master.entities.User#1]
o.h.engine.internal.TwoPhaseLoad : Adding entity to second-level cache: [com.voyant.master.entities.User#1]
o.h.engine.internal.TwoPhaseLoad : Done materializing entity [com.voyant.master.entities.User#1]
o.h.r.j.i.ResourceRegistryStandardImpl : HHH000387: ResultSet's statement was not registered
.l.e.p.AbstractLoadPlanBasedEntityLoader : Done entity load : com.voyant.master.entities.User#1
o.h.e.t.internal.TransactionImpl : committing
获取 2
o.h.e.t.internal.TransactionImpl : begin
o.h.e.t.internal.TransactionImpl : committing
现在,有问题的实体定义:
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "user")
@Entity
public class User2 {
@Id
@Column(name = "username")
private String username;
@Column(name = "lastname")
private String lastname;
@Column(name = "name")
private String name;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User2(String name) {
this.name = name;
}
public User2() {
}
}
来自同一实体的两次连续提取的休眠调试日志
获取 1
o.h.e.t.internal.TransactionImpl : begin
o.h.jpa.criteria.CriteriaQueryImpl : Rendered criteria query -> select generatedAlias0 from User2 as generatedAlias0 where generatedAlias0.username=:param0
org.hibernate.SQL : select user2x0_.username as username1_0_, user2x0_.lastname as lastname2_0_, user2x0_.name as name3_0_ from user user2x0_ where user2x0_.username=?
org.hibernate.loader.Loader : Result set row: 0
org.hibernate.loader.Loader : Result row: EntityKey[com.voyant.master.entities.User2#dharam]
o.h.engine.internal.TwoPhaseLoad : Resolving associations for [com.voyant.master.entities.User2#dharam]
o.h.engine.internal.TwoPhaseLoad : Adding entity to second-level cache: [com.voyant.master.entities.User2#dharam]
o.h.engine.internal.TwoPhaseLoad : Done materializing entity [com.voyant.master.entities.User2#dharam]
o.h.e.t.internal.TransactionImpl : committing
o.h.e.i.AbstractFlushingEventListener : Processing flush-time cascades
o.h.e.i.AbstractFlushingEventListener : Dirty checking collections
o.h.e.i.AbstractFlushingEventListener : Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
o.h.e.i.AbstractFlushingEventListener : Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
o.hibernate.internal.util.EntityPrinter : Listing entities:
o.hibernate.internal.util.EntityPrinter : com.voyant.master.entities.User2{name=dharam, username=dharam, lastname=dharam}
获取 2
o.h.e.t.internal.TransactionImpl : begin
o.h.jpa.criteria.CriteriaQueryImpl : Rendered criteria query -> select generatedAlias0 from User2 as generatedAlias0 where generatedAlias0.username=:param0
org.hibernate.SQL : select user2x0_.username as username1_0_, user2x0_.lastname as lastname2_0_, user2x0_.name as name3_0_ from user user2x0_ where user2x0_.username=?
org.hibernate.loader.Loader : Result set row: 0
org.hibernate.loader.Loader : Result row: EntityKey[com.voyant.master.entities.User2#dharam]
o.h.engine.internal.TwoPhaseLoad : Resolving associations for [com.voyant.master.entities.User2#dharam]
o.h.engine.internal.TwoPhaseLoad : Adding entity to second-level cache: [com.voyant.master.entities.User2#dharam]
o.h.engine.internal.TwoPhaseLoad : Done materializing entity [com.voyant.master.entities.User2#dharam]
o.h.e.t.internal.TransactionImpl : committing
o.h.e.i.AbstractFlushingEventListener : Processing flush-time cascades
o.h.e.i.AbstractFlushingEventListener : Dirty checking collections
o.h.e.i.AbstractFlushingEventListener : Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
o.h.e.i.AbstractFlushingEventListener : Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
o.hibernate.internal.util.EntityPrinter : Listing entities:
o.hibernate.internal.util.EntityPrinter : com.voyant.master.entities.User2{name=dharam, username=dharam, lastname=dharam}
【问题讨论】:
-
您能否将您的用户类更改为实现 Serializable 并查看它是否有效。 *********公共类用户实现可序列化{
-
对不起!用户类都很好。问题出在 User2 类上,但是是的!我会尝试你的建议。
-
道歉我的意思是有问题的人。
-
试过了!但没有运气。顺便说一句,感谢您阅读冗长的问题并尝试一下。
-
没问题。阅读以下文章dzone.com/articles/hibernate-types
标签: hibernate spring-boot second-level-cache