主要问题:hibernate中集合映射list中的list-index中的问题:
参见一个配置文件:
<class name="User" table="l_user">
<id column="id" name="id"/>
<property name="name" column="username" />
<list name="userInfoList" inverse="true" cascade="all" lazy="false">
<key column="userid" not-null="true"/>
<list-index column="userinfoid" />
<one-to-many class="UserInfo" />
</list>
</class>
<class name="UserInfo" table="l_userinfo">
<id name="userinfoid" column="userinfoid" />
<property name="infoType" column="infotype" />
<property name="startDate" column="startdate" type="timestamp" />
<property name="endDate" column="enddate" type="timestamp" />
<many-to-one name="includeUser" column="userid" class="User"/>
</class>
在User类的配置文件中配置了一个List是指定他向UserInfo的关联。其中有key,这是指定UserInfo类对应的table中的关联User类对应的表的外键。使用的是userId;然后就是List-index这个是有序的集合需要配置的内容。我们在这里给他配置的是userinfoid就是UserInfo对应的表的主键。但是这里面是存在一个问题的:list-index在我们取得User对象然后拿到与他关联的UserInfo的List的时候发挥一个非常重要的作用。List-index会要求从0开始,然后自增上去。如果一个User有100个与他关联的UserInfo对象。假设这些UserInfo的id分别是从0-99则没有问题。他会取到这100个关联对象。如果这些UserInfo的Id是从0-50 100-149,那就会有问题了,我们通过User访问UserInfoLIst的时候hibernate会自动发出sql语句拿到与他关联的UserInfo对象。但是他拿到的会是一个大小为150的UserInfoLIst,但是这个list中并不是每一个都是一个完整的UserInfo对象。另外多余的UserInfo对象在这个list里面都是null。这样就会导致一个很严重的问题,如果我们的UserInfo有一个Id是10000,那么他返回的List就是一个大小为10000的list。只是里面有很多空对象。而且我们在遍历访问其中的对象的时候也会做很多没有用的工作。所以我们有必要另外再建立一个属性,作为list映射的List-index使用。但是我们还非常有必要去维护他的值,而且保证他是连续的。如果这样的话那么这种使用外键维护双向的一对多的关系是一个很不可取的方式。或者我们可以直接把他换成set。
转载:http://buzuibuxiu.iteye.com/blog/1028063
分享到:
相关推荐
映射文件(如`Login.hbm.xml`)则定义了类与表之间的映射规则,告诉Hibernate如何将对象转换为数据库记录。 4. **在配置文件中指定映射文件路径**:在`hibernate.cfg.xml`中通过`<mapping>`元素引入映射文件: ```...
- **使用 FetchMode.JOIN**:在 hbm.xml 映射文件中,将 fetch 属性设置为 JOIN,或者使用 @Fetch(FetchMode.JOIN) 注解。 ```xml ``` ```java @Entity public class User { @Id private Long id...
1. **XML配置**:在Hibernate的映射文件(.hbm.xml)中,使用`<list>`标签定义List集合映射。例如: ```xml <list name="courses" table="course_student" inverse="true"> <index column="list_index"/> </...
为了使用Hibernate,我们需要配置hibernate.cfg.xml文件,并为每个实体类定义相应的.hbm.xml映射文件。这些配置文件告诉Hibernate如何将Java对象映射到数据库表中。 ```xml <!-- hibernate.cfg.xml --> <hibernate-...
命名查询将HQL语句写在`.hbm.xml`配置文件中,如`<query name="queryUserRange">`,这提高了代码的可维护性。在Java代码中,可以通过`session.getNamedQuery("queryUserRange")`调用。 理解并熟练运用这些HQL特性...
- **list()**:将查询结果转换为 List 集合,一次性加载所有结果,适用于数据量较小的情况,因为所有结果都会加载到内存中。 - **iterator()**:返回一个迭代器,可以按需逐条加载数据,减少内存占用,适合大数据量...
在本文中,我们将深入探讨如何在MyEclipse中配置并使用Hibernate进行数据库操作。Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者通过Java对象来操作数据库,避免了直接编写SQL语句的繁琐过程。 首先...
- **按 ID 查询**:使用 HQL(Hibernate Query Language)或 Criteria API 来查询特定 ID 的记录。 ```java String hql = "FROM Person WHERE id = ?"; Query query = session.createQuery(hql); query....
### 泛型Hibernate的实现与Spring集成 #### 一、泛型Hibernate概念及其实现 在Java开发领域,尤其在企业级应用开发中,Hibernate框架因其强大的对象关系映射(ORM)能力而受到广泛欢迎。泛型Hibernate是利用Java...
1. **列表(List)**:使用`list`方法查询时,Hibernate会在一级缓存中查找结果;如果没有命中,则会查询数据库,并将结果放入缓存。 2. **迭代器(Iterator)**:使用`iterator`方法查询时,Hibernate同样会先尝试...
6. 查询(Query):使用HQL(Hibernate Query Language)或Criteria API进行查询,更面向对象,可避免SQL注入。 五、事务管理 Hibernate支持JTA(Java Transaction API)和JDBC事务管理。Session的beginTransaction...
`SessionFactory`的创建是基于Hibernate的配置文件(通常为`hibernate.cfg.xml`)和映射文件(`.hbm.xml`)。配置文件包含了数据库连接信息,而映射文件定义了Java对象与数据库表之间的映射关系。 创建`...
本主题将深入探讨使用Hibernate进行多对多双向关联的实现,既可以通过注解(Annotation)方式,也可以通过XML配置文件来完成。 首先,我们来看多对多关联的基本概念。在数据库设计中,当两个实体之间存在多个实例...
在 Spring 中使用 Hibernate 通常有两种方式:一是使用 HibernateTemplate 或 HibernateDaoSupport,另一种是直接使用 Hibernate 的原生 API。这里我们关注后者,通过 Spring 注入 SessionFactory 到 DAO 类中,然后...
2. **查询记录**: ```java Criteria criteria = session.createCriteria(Message.class); List<Message> messages = criteria.list(); for (Message m : messages) { System.out.println(m.getText()); } ``...
2. **映射方式**:XML映射文件(hibernate.cfg.xml和.hbm.xml)和注解映射的使用,对比两者的特点和适用场景。 3. **实体类映射**:如何定义实体类,以及如何将类的属性与数据库字段对应,包括基本类型、复杂类型...