- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是否正确初始化了惰性集合?我的主要目标是进行数据库查询并初始化惰性集合,以便它可以由没有数据库 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/
编辑:我似乎问错了这个问题。 我正在尝试寻找一种方法来查询一个集合是否在另一个集合中可用。例如: SELECT * FROM something WHERE (1, 3) IN (1, 2, 3, 4
这两种方法似乎 produce the same results ,但我一直很难真正说服人们第二种方法有效,因为它显然并不为人所知。 // Create some data var foo = { '
我一直在学习Kotlin,并且遇到过Collections API。在Kotlin之前,我一直在学习Java,并且我知道Java中有很多不同类型的Collections API。例如,我们使用List
为什么我会得到不同的行为: Collection col2 = new ArrayList(col); 集合 col2 = new ArrayList(); col2.addAll(col) 我正在与
所以我有一个代表专辑信息的 JSON 对象。给定“function updateRecords(id, prop, value)”我希望能够更新每个条目。正确的完成代码如下。 我得到了指示,粗体部分,
我想存储一个对象集合,这些对象根据它们所代表的值进行键控。这些键可以重复。例如: [4] => Bob [5] => Mary [5] => Sue [9] => Steve [10] =>
在检查 ArrayList API 时,我注意到一些看起来很奇怪的东西。 确实,这里是 ArrayList 构造函数实现,其中 Collection 作为参数传递: public ArrayList(
我正在为 API 编写一个 swagger 定义文件。 API 是用于 GET 请求的 /path/to/my/api: get: summary: My Custom API d
我知道scala.collection包中有两个非常有用的对象,可以帮助我们实现这个目标: JavaConverters(如果我想明确说明并准确说明我要转换的内容) JavaConversions(如
我已经阅读了无数其他帖子,但似乎无法弄清楚发生了什么,所以是时候寻求帮助了。 我正在尝试将包含集合的域实体映射到也包含集合的 dtos。 这是一个原始示例; (我提前为代码墙道歉,我尽量保持简短):
我正在创建一个具有 ArrayList 的类,因此当我调用构造函数时,它会初始化该数组: public class ElementsList { private ArrayList list;
我正在阅读事件指南和指南的开头,它说: You can also add an event listener to any element in the this.$ collection using
我是 Python 新手,想知道如何使用键在字典中存储不同数据类型的列表 例如 - {[Key1,int1,int1,String1] , [Key2,int2,int2,String2], [Key
int[] mylist = { 2, 4, 5 }; IEnumerable list1 = mylist; list1.ToList().Add(1); // why 1 does not get
我在 UI 表单中的每一行之后将以下内容添加到 HashMap 集合中 声明 Map> map = new HashMap>(); List valSetOne = new ArrayList();
我正在开发我的第一个 Java 项目,我有一个问题。问题应该很简单(虽然代码不是那么短,但没有理由被吓倒:))。我创建了一个基本的角色扮演游戏,并且有一个定义每个角色的抽象类“Character”。在
我正在开发一款应用程序,可以为用户收集推文、Facebook 状态和 Facebook 照片。目前,用户确切地设定了他们希望这种收获发生的时间和时间,并且蜘蛛会在此期间拉取数据。 when 和 to
有谁知道在 C# 中是否有与 Java 的 Set 集合等效的好方法?我知道您可以通过填充但忽略值来使用 Dictionary 或 HashTable 在某种程度上模仿集合,但这不是一种非常优雅的方式
EXISTS 该函数返回 集合中第一个元素的索引,如果集合为空,返回NULLNULLNULL Collecti
RDF集合是通过属性 rdf:parseType="Collection" 来描述仅包含指定成员的组 rdf:parseType="Collection" 属
我是一名优秀的程序员,十分优秀!