gpt4 book ai didi

java - Hibernate Lazy 集合的正确初始化

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:46 25 4
gpt4 key购买 nike

我是否正确初始化了惰性集合?我的主要目标是进行数据库查询并初始化惰性集合,以便它可以由没有数据库 session 的方法使用。

我当前的方法有效,但它似乎多次查询数据库。谁能确认这是正确的或告诉我正确的方法。

服务类方法

    public void testing() {

try {
List<User> users = test();

for (User user : users) {
System.out.println(user);
Set<UserGroupMapping> userGroupMapping = user.getUserGroupMappings();

for (UserGroupMapping userGroupMapping : userGroupMapping) {
System.out.println(userGroupMapping);
}

}

} catch (Exception e) {
e.printStackTrace();
}

}

@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = true)
private List<User> test() {
return dao.findUsers();
}

Dao类方法

@Transactional(value = "transactionManager", propagation = Propagation.MANDATORY, isolation = Isolation.DEFAULT, readOnly = true)
public List<User> findUsers() {
Criteria criteria = getCesSession().createCriteria(User.class);

criteria.setFetchMode("userGroupMappings", FetchMode.SELECT);

@SuppressWarnings("unchecked")
List<User> list = (List<User>) criteriaList(criteria);

for (User user : list) {
Set<UserGroupMapping> b = user.getUserGroupMappings();

Hibernate.initialize(b);

for (UserGroupMapping userGroupMapping : b) {
Hibernate.initialize(userGroupMapping.getGroup());
}

}

return list;
}

用户实体

@Entity
@Table(name = "[User]", schema = "dbo", catalog = "Test", uniqueConstraints = @UniqueConstraint(columnNames = "userName"))
public class User extends DatabaseObject {

private Long userId;
private Set<UserGroupMapping> userGroupMappings = new HashSet<UserGroupMapping>(
0);

@Id
@Column(name = "userId", unique = true, nullable = false)
public Long getUserId() {
return this.userId;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
public Set<UserGroupMapping> getUserGroupMappings() {
return this.userGroupMappings;
}

群组实体

@Entity
@Table(name = "[Group]", schema = "dbo", catalog = "Test", uniqueConstraints = @UniqueConstraint(columnNames = "name"))
public class Group extends DatabaseObject {

private Long groupId;
private Set<GroupRoleMapping> groupRoleMappings = new HashSet<GroupRoleMapping>(0);
private Set<UserGroupMapping> userGroupMappings = new HashSet<UserGroupMapping>(0);

@Id
@Column(name = "groupId", unique = true, nullable = false)
public Long getGroupId() {
return this.groupId;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "group")
public Set<GroupRoleMapping> getGroupRoleMappings() {
return this.groupRoleMappings;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "group")
public Set<UserGroupMapping> getUserGroupMappings() {
return this.userGroupMappings;
}

UserGroupMapping 实体

@Entity
@Table(name = "UserGroupMapping", schema = "dbo", catalog = "Test", uniqueConstraints = @UniqueConstraint(columnNames = "userId"))
public class UserGroupMapping extends DatabaseObject {

private Long userGroupMappingId;
private Group group;
private User user;

@Id
@Column(name = "userGroupMappingId", unique = true, nullable = false)
public Long getUserGroupMappingId() {
return this.userGroupMappingId;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "groupId", nullable = false)
public Group getGroup() {
return this.group;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", unique = true, nullable = false)
public User getUser() {
return this.user;
}
}

日志

DEBUG: 15:19:22.251 - 
/* criteria query */ select
this_.userId as userId1_17_0_,
this_.createdBy as createdB2_17_0_,
this_.dateCreated as dateCrea3_17_0_,
this_.dateUpdated as dateUpda4_17_0_,
this_.name as name5_17_0_,
this_.password as password6_17_0_,
this_.updatedBy as updatedB7_17_0_,
this_.userName as userName8_17_0_
from
CES_SIT.dbo.[User] this_
Hibernate:
/* criteria query */ select
this_.userId as userId1_17_0_,
this_.createdBy as createdB2_17_0_,
this_.dateCreated as dateCrea3_17_0_,
this_.dateUpdated as dateUpda4_17_0_,
this_.name as name5_17_0_,
this_.password as password6_17_0_,
this_.updatedBy as updatedB7_17_0_,
this_.userName as userName8_17_0_
from
CES_SIT.dbo.[User] this_




DEBUG: 15:19:39.159 -
select
usergroupm0_.userId as userId7_17_0_,
usergroupm0_.userGroupMappingId as userGrou1_15_0_,
usergroupm0_.userGroupMappingId as userGrou1_15_1_,
usergroupm0_.createdBy as createdB2_15_1_,
usergroupm0_.dateCreated as dateCrea3_15_1_,
usergroupm0_.dateUpdated as dateUpda4_15_1_,
usergroupm0_.groupId as groupId6_15_1_,
usergroupm0_.updatedBy as updatedB5_15_1_,
usergroupm0_.userId as userId7_15_1_
from
CES_SIT.dbo.UserGroupMapping usergroupm0_
where
usergroupm0_.userId=?
Hibernate:
select
usergroupm0_.userId as userId7_17_0_,
usergroupm0_.userGroupMappingId as userGrou1_15_0_,
usergroupm0_.userGroupMappingId as userGrou1_15_1_,
usergroupm0_.createdBy as createdB2_15_1_,
usergroupm0_.dateCreated as dateCrea3_15_1_,
usergroupm0_.dateUpdated as dateUpda4_15_1_,
usergroupm0_.groupId as groupId6_15_1_,
usergroupm0_.updatedBy as updatedB5_15_1_,
usergroupm0_.userId as userId7_15_1_
from
CES_SIT.dbo.UserGroupMapping usergroupm0_
where
usergroupm0_.userId=?



DEBUG: 15:19:39.176 - Preparing collection intializer : [com.bdo.ces.entities.User.userGroupMappings#1]
DEBUG: 15:19:39.176 - Starting ResultSet row #0
DEBUG: 15:19:39.177 - Found row of collection: [com.bdo.ces.entities.User.userGroupMappings#1]
DEBUG: 15:19:39.177 - Resolving associations for [com.bdo.ces.entities.UserGroupMapping#1]
DEBUG: 15:19:39.177 - Done materializing entity [com.bdo.ces.entities.UserGroupMapping#1]
DEBUG: 15:19:39.177 - 1 collections were found in result set for role: com.bdo.ces.entities.User.userGroupMappings
DEBUG: 15:19:39.177 - Collection fully initialized: [com.bdo.ces.entities.User.userGroupMappings#1]
DEBUG: 15:19:39.177 - 1 collections initialized for role: com.bdo.ces.entities.User.userGroupMappings
DEBUG: 15:19:39.177 - Done loading collection
DEBUG: 15:19:39.177 - Initializing proxy: [com.bdo.ces.entities.Group#1]
DEBUG: 15:19:39.177 -
select
group0_.groupId as groupId1_16_0_,
group0_.createdBy as createdB2_16_0_,
group0_.dateCreated as dateCrea3_16_0_,
group0_.dateUpdated as dateUpda4_16_0_,
group0_.description as descript5_16_0_,
group0_.name as name6_16_0_,
group0_.updatedBy as updatedB7_16_0_,
group0_.visible as visible8_16_0_
from
CES_SIT.dbo.[
Group] group0_ where
group0_.groupId=?
Hibernate:
select
group0_.groupId as groupId1_16_0_,
group0_.createdBy as createdB2_16_0_,
group0_.dateCreated as dateCrea3_16_0_,
group0_.dateUpdated as dateUpda4_16_0_,
group0_.description as descript5_16_0_,
group0_.name as name6_16_0_,
group0_.updatedBy as updatedB7_16_0_,
group0_.visible as visible8_16_0_
from
CES_SIT.dbo.[
Group] group0_ where
group0_.groupId=?

使用 K.C 进行测试==================================

Dao类方法

@Transactional(value = "transactionManager", propagation = Propagation.MANDATORY, isolation = Isolation.DEFAULT, readOnly = true)
public List<User> findUsers() {
Criteria criteria = getCesSession().createCriteria(User.class);

criteria.setFetchMode("userGroupMappings", FetchMode.JOIN);

criteria.createAlias("userGroupMappings", "userGroupMappings",
JoinType.LEFT_OUTER_JOIN);

@SuppressWarnings("unchecked")
List<User> list = (List<User>) criteriaList(criteria);

Hibernate.initialize(list);

for (User user : list) {
Set<UserGroupMapping> b = user.getUserGroupMappings();

Hibernate.initialize(b);

for (UserGroupMapping userGroupMapping : b) {
Hibernate.initialize(userGroupMapping.getGroup());
}

}

return list;

}

日志

DEBUG: 17:40:19.989 - 
/* criteria query */ select
this_.userId as userId1_17_1_,
this_.createdBy as createdB2_17_1_,
this_.dateCreated as dateCrea3_17_1_,
this_.dateUpdated as dateUpda4_17_1_,
this_.name as name5_17_1_,
this_.password as password6_17_1_,
this_.updatedBy as updatedB7_17_1_,
this_.userName as userName8_17_1_,
usergroupm1_.userId as userId7_17_3_,
usergroupm1_.userGroupMappingId as userGrou1_15_3_,
usergroupm1_.userGroupMappingId as userGrou1_15_0_,
usergroupm1_.createdBy as createdB2_15_0_,
usergroupm1_.dateCreated as dateCrea3_15_0_,
usergroupm1_.dateUpdated as dateUpda4_15_0_,
usergroupm1_.groupId as groupId6_15_0_,
usergroupm1_.updatedBy as updatedB5_15_0_,
usergroupm1_.userId as userId7_15_0_
from
CES_SIT.dbo.[User] this_
left outer join
CES_SIT.dbo.UserGroupMapping usergroupm1_
on this_.userId=usergroupm1_.userId
Hibernate:
/* criteria query */ select
this_.userId as userId1_17_1_,
this_.createdBy as createdB2_17_1_,
this_.dateCreated as dateCrea3_17_1_,
this_.dateUpdated as dateUpda4_17_1_,
this_.name as name5_17_1_,
this_.password as password6_17_1_,
this_.updatedBy as updatedB7_17_1_,
this_.userName as userName8_17_1_,
usergroupm1_.userId as userId7_17_3_,
usergroupm1_.userGroupMappingId as userGrou1_15_3_,
usergroupm1_.userGroupMappingId as userGrou1_15_0_,
usergroupm1_.createdBy as createdB2_15_0_,
usergroupm1_.dateCreated as dateCrea3_15_0_,
usergroupm1_.dateUpdated as dateUpda4_15_0_,
usergroupm1_.groupId as groupId6_15_0_,
usergroupm1_.updatedBy as updatedB5_15_0_,
usergroupm1_.userId as userId7_15_0_
from
CES_SIT.dbo.[User] this_
left outer join
CES_SIT.dbo.UserGroupMapping usergroupm1_
on this_.userId=usergroupm1_.userId


select
group0_.groupId as groupId1_16_0_,
group0_.createdBy as createdB2_16_0_,
group0_.dateCreated as dateCrea3_16_0_,
group0_.dateUpdated as dateUpda4_16_0_,
group0_.description as descript5_16_0_,
group0_.name as name6_16_0_,
group0_.updatedBy as updatedB7_16_0_,
group0_.visible as visible8_16_0_
from
CES_SIT.dbo.[
Group] group0_ where
group0_.groupId=?
Hibernate:
select
group0_.groupId as groupId1_16_0_,
group0_.createdBy as createdB2_16_0_,
group0_.dateCreated as dateCrea3_16_0_,
group0_.dateUpdated as dateUpda4_16_0_,
group0_.description as descript5_16_0_,
group0_.name as name6_16_0_,
group0_.updatedBy as updatedB7_16_0_,
group0_.visible as visible8_16_0_
from
CES_SIT.dbo.[
Group] group0_ where
group0_.groupId=?

DEBUG: 17:40:38.189 -
select
group0_.groupId as groupId1_16_0_,
group0_.createdBy as createdB2_16_0_,
group0_.dateCreated as dateCrea3_16_0_,
group0_.dateUpdated as dateUpda4_16_0_,
group0_.description as descript5_16_0_,
group0_.name as name6_16_0_,
group0_.updatedBy as updatedB7_16_0_,
group0_.visible as visible8_16_0_
from
CES_SIT.dbo.[
Group] group0_ where
group0_.groupId=?
Hibernate:
select
group0_.groupId as groupId1_16_0_,
group0_.createdBy as createdB2_16_0_,
group0_.dateCreated as dateCrea3_16_0_,
group0_.dateUpdated as dateUpda4_16_0_,
group0_.description as descript5_16_0_,
group0_.name as name6_16_0_,
group0_.updatedBy as updatedB7_16_0_,
group0_.visible as visible8_16_0_
from
CES_SIT.dbo.[
Group] group0_ where
group0_.groupId=?
DEBUG: 17:40:38.197 - Starting ResultSet row #0

最终==============================

使用这段代码让它工作我仍然不确定这是否是最好的方法,但它只在一个查询中加载惰性集合。我还在 [userGroupMappings.group] 中加入了惰性对象以使其正常工作。

我以为 Hibernate.initialize() 会为我做到这一点,但事实并非如此。

**Dao Class Method**


@Transactional(value = "transactionManager", propagation = Propagation.MANDATORY, isolation = Isolation.DEFAULT, readOnly = true)
public List<User> findUsers() {
Criteria criteria = getCesSession().createCriteria(User.class);

criteria.createCriteria("userGroupMappings", "userGroupMappings",
JoinType.LEFT_OUTER_JOIN);
criteria.createCriteria("userGroupMappings.group", "userGroupMappings.group",
JoinType.LEFT_OUTER_JOIN);

@SuppressWarnings("unchecked")
List<User> list = (List<User>) criteriaList(criteria);



return list;

}

最佳答案

由于 User - UserGroupMapping 1 - n 映射,您有 n + 1 选择问题,如here所述。这就是为什么您有这么多疑问。

您可以通过在 UserGroupMapping 上执行左外连接来避免这种情况。

关于java - Hibernate Lazy 集合的正确初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24157069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com