现象:项目开发中,根据需求会设计一些比较繁琐的视图,但是使用过程中发现一种奇怪的现象:在SQL语句在数据库中可以查询出正确的结果,但是通过Hibernate查询的结果却为空值;更奇怪的是,HQL查出来的总记录数是正确的,然结果集中却没有对应的数据。
出现这种现象的原因分析:hibernate 反向工程向导会为视图自动生成一个复合主键, 这个主键是用所有字段加在一起实现的,所以如果其中有一个为空就会报空指针异常。
解决思路:修改映射的复合型主键,将两张表的主键合起来作为复合型主键,其余字段作为普通值。
举例说明:
1、表结构及关系
(1)结构:
Maintain_form 表
Equipment_dictionary 表
Maintain_equipment表
(2)关系:Maintain_equipment表中的maintain_id作为外键映射Maintain_form 表;Maintain_equipment表中的dictionary_id作为外键映射Equipment_dictionary 表
2、视图
CREATE VIEW maintain_all AS select rand(10) AS rand_id, m.maintain_id AS maintain_id, me.dictionary_id AS dictionary_id from maintain_form m left join maintain_equipment me on m.maintain_id = me.maintain_id
说明:因为:dictionary_id可能为null,所以很多查询结果为空。所以,生成视图后映射文件后做了如下修改:
(1)dictionary_id 映射的对象提出来作为普通属性。
(2)符合主键只有:rand_id 和maintain_id;
3、视图maintain_all的映射文件和javabean
MaintainAll.hbm.xml
<hibernate-mapping>
<class name="com.equipment.po.MaintainAll" table="maintain_all" catalog="equipment">
<composite-id name="id" class="com.equipment.po.MaintainAllId">
<key-property name="randId" type="java.lang.Double">
<column name="rand_id" precision="22" scale="0" />
</key-property>
<key-many-to-one name="maintainForm" class="com.equipment.po.MaintainForm" lazy="false">
<column name="maintain_id" length="20" />
</key-many-to-one>
</composite-id>
<many-to-one name="dictionary" class="com.equipment.po.EquipmentDictionary" lazy="false" fetch="select">
<column name="dictionary_id" />
</many-to-one>
</class>
</hibernate-mapping>
MaintainAll.java
package com.equipment.po;
/**
* MaintainAll generated by MyEclipse - Hibernate Tools
*/
public class MaintainAll implements java.io.Serializable {
// Fields
private MaintainAllId id;
private EquipmentDictionary dictionary;
// Constructors
/** default constructor */
public MaintainAll() {
}
/** full constructor */
public MaintainAll(MaintainAllId id,EquipmentDictionary dictionary) {
this.id = id;
this.dictionary = dictionary;
}
// Property accessors
public MaintainAllId getId() {
return this.id;
}
public void setId(MaintainAllId id) {
this.id = id;
}
public EquipmentDictionary getDictionary() {
return dictionary;
}
public void setDictionary(EquipmentDictionary dictionary) {
this.dictionary = dictionary;
}
}
MaintainAllId.java
package com.equipment.po;
/**
* MaintainAllId generated by MyEclipse - Hibernate Tools
*/
public class MaintainAllId implements java.io.Serializable {
// Fields
private Double randId;
private MaintainForm maintainForm;
// Constructors
/** default constructor */
public MaintainAllId() {
}
/**
* @param maintainForm
* @param dictionary
*/
public MaintainAllId(MaintainForm maintainForm) {
this.maintainForm = maintainForm;
}
// Property accessors
public MaintainForm getMaintainForm() {
return maintainForm;
}
public void setMaintainForm(MaintainForm maintainForm) {
this.maintainForm = maintainForm;
}
public Double getRandId() {
return randId;
}
public void setRandId(Double randId) {
this.randId = randId;
}
}
分享到:
相关推荐
- 当一方实体为空时,需要处理好空值情况,防止出现null pointer异常。 通过以上步骤,我们就可以在Hibernate中实现单向一对一主键映射。这个实例中的`hibernate_fifth_one2one_pk_1`文件可能包含了相关的代码示例...
4. **条件判断函数**:IFNULL(), NVL() 用于处理空值。 5. **分组和排序函数**:GROUP BY, HAVING 进行数据分组,ORDER BY 进行排序。 了解并熟练掌握这些SSH框架和Oracle数据库的常用函数,能帮助开发者更高效地...
2. **数据预处理**:在导入数据之前,可能需要对Excel数据进行一些预处理,如格式转换、空值处理、异常值检查等。Java的反射机制可以用于动态地处理对象和类,帮助我们根据需要创建和操作数据模型。 3. **使用...
2.3.4装配空值 2.4自动装配 2.4.1四种自动装配类型 2.4.2混合使用自动和手动装配 2.4.3何时采用自动装配 2.5控制bean创建 2.5.1bean范围化 2.5.2利用工厂方法来创建bean 2.5.3初始化和销毁bean 2.6小结 第...
在这个项目中,SSH2被用来处理业务逻辑、视图展示以及数据库交互。 Spring框架是SSH的核心,它负责管理应用中的对象,包括依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP...
2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean ...
2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean ...
1. **错误类型**:导入错误可能由多种原因引起,如文件格式不兼容、数据类型不匹配、编码问题、空值处理不当、超出内存限制等。例如,如果使用了不支持的Excel版本或者数据中包含非预期的特殊字符,都可能导致导入...
SpringMVC是Spring的一个模块,专门用于构建Web应用程序,它实现了模型-视图-控制器(MVC)架构模式。 **Hibernate** 是一个强大的对象关系映射(ORM)框架,它允许开发者用Java对象来表示数据库表,通过简单的API...
- 提升系统性能,因为视图和控制逻辑不在同一层处理。 12. **Struts中的增删改查操作** - 一般情况下,每个操作对应一个Action,这样可以保持Action的职责单一,便于管理和维护。 13. **Struts中ActionForm的...
- 数据迁移过程中,应考虑数据转换的兼容性,如日期格式、空值处理和字符编码等。 - 为了保证移植后的系统稳定性,需要进行详尽的测试,包括功能测试和性能测试。 6. **性能优化**: - MySQL可能需要进行额外的...
Oracle ORA 异常处理详解 Oracle 是一个强大的关系数据库管理系统,然而,在使用 Oracle 时,总是会遇到各种错误信息,这些错误信息是Oracle抛出的异常信息,用于提示开发者出现了什么问题。了解这些错误信息是...
7. **安全防护**:项目应考虑防止SQL注入、XSS跨站脚本攻击等常见安全威胁,使用预编译语句或ORM框架(如Hibernate)来处理数据库查询。 8. **状态管理**:由于Web是无状态的,所以需要使用cookies或session来保持...
- **非空约束 (NOT NULL)**:指定某列不允许为空值。 - **主键约束 (PRIMARY KEY)**:用于唯一标识表中的每一行数据。 - **外键约束 (FOREIGN KEY)**:用于建立表与表之间的关系。 #### 五、Hibernate的工作原理...
- 是一个工具类,包含了一系列用于操作或返回`Collection`视图的静态方法。 - 它提供了一些实用的方法,如排序、查找最大或最小元素等。 ### Spring的bean 1. **Bean的概念**: - 在Spring框架中,Bean是指由...
##### Hibernate事务处理 - 使用`Transaction`接口进行事务管理。 ##### Hibernate的三种状态以及状态的转换 - **瞬时态**:未托管的状态。 - **持久态**:处于事务管理下的状态。 - **游离态**:从持久态转换而来...
SQL(Structured Query Language)部分可能测试查询、插入、更新、删除操作,以及联接、子查询、视图、索引等高级特性。 【JDBC & Hibernate】 这部分考察对Java数据库连接(JDBC)和Hibernate ORM框架的理解,包括...
6. **数据绑定**: Flex支持数据绑定,使得视图组件的状态可以直接反映模型数据的变化,简化了代码。 在Flexdemo登录系统中,我们可能会看到以下几个关键部分: 1. **登录表单**: 包含用户名和密码输入字段,以及...
- **下载 JPA 实现(Downloading a JPA Implementation)**:要使用JPA,首先需要下载并配置一个JPA提供者,如Hibernate或EclipseLink。 **9.5 章节总结** - 本章讨论了如何使用Java持久化架构(JPA)在Java应用程序中...
2. **MVC模式**:模型(Model)-视图(View)-控制器(Controller),是Web开发中最常用的架构模式之一,用于分离业务逻辑、数据和界面展示。 3. **工厂模式**:提供了一个创建对象的接口,但让子类决定实例化哪一个类。...