如何在Hibernate Application中处理数据库空值?

时间:2015-04-01 05:36:38

标签: java hibernate

我正在" org.hibernate.PropertyAccessException"由于我的数据库表中的空值。如何处理异常?

我的文件是

FetchTest.java



package com.raj.java.hiberanteDemos;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class FetchTest {
public static void main(String[] args) {
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
SessionFactory factory=cfg.buildSessionFactory();
	
	Session session1=factory.openSession();
	Employee emp1=(Employee)session1.get(Employee.class,7839);
	System.out.println(emp1.getEmpno()+" "+emp1.getEname()+" "+emp1.getSal());
	session1.close();
	
	Session session2=factory.openSession();
	Employee emp2=(Employee)session2.load(Employee.class,7839);
	System.out.println(emp2.getEmpno()+" "+emp2.getEname()+" "+emp2.getSal());
	session2.close();
	
}
}




Employee.java



package com.raj.java.hiberanteDemos;

import java.sql.Date;


  class Employee {
	private int empno, mgr, deptnumber;
	private String ename, job;
	private double sal, comm;
	private Date hiredate;

	public int getEmpno() {
		return empno;
	}

	public void setEmpno(int empno) {
		this.empno = empno;
	}

	public int getMgr() {
		return mgr;
	}

	public void setMgr(int mgr) {
		this.mgr = mgr;
	}

	public int getDeptnumber() {
		return deptnumber;
	}

	public void setDeptnumber(int deptnumber) {
		this.deptnumber = deptnumber;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public double getComm() {
		return comm;
	}

	public void setComm(double comm) {
		this.comm = comm;
	}

	public Date getHiredate() {
		return hiredate;
	}

	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public double getSal() {
		return sal;
	}

	public void setSal(double sal) {
		this.sal = sal;
	}

}




的hibernate.cfg.xml



<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

	<session-factory>
		<property name="hbm2ddl.auto">update</property>
		<property name="dialect">org.hibernate.dialect.Oracle9Dialect
      </property>
		<property name="connection.url">someValidurl</property>
		<property name="connection.username">username</property>
		<property name="connection.password">password</property>
		<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
		<property name="hibernate.show_sql">true</property>
		<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
		<property name="hibernate.cache.use_second_level_cache">true</property>
		<mapping resource="employee.hbm.xml"></mapping>
	</session-factory>

</hibernate-configuration>
&#13;
&#13;
&#13;

employee.hbm.xml

&#13;
&#13;
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- <class name="com.javatpoint.mypackage.Employee" table="employee"> <id 
		name="empid"> <generator class="assigned"></generator> </id> <property name="firstName"></property> 
		<property name="lastName"></property> </class> -->
	<class name="com.raj.java.hiberanteDemos.Employee" table="emp">
		<id name="empno" type="int" column="EMPNO">
			<generator class="increment" />
		</id>
		<property name="ename" type="java.lang.String" />
		<property name="mgr" type="int" />
		<property name="deptnumber" type="int" column="deptno" />
		<property name="job" type="java.lang.String" />
		<property name="sal" type="double" />
		<property name="comm" type="double" />
		<property name="hiredate" type="java.sql.Date" />

	</class>
</hibernate-mapping>
&#13;
&#13;
&#13;

当我运行此应用程序时,我收到以下错误消息。

&#13;
&#13;
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select employee0_.EMPNO as EMPNO0_0_, employee0_.ename as ename0_0_, employee0_.mgr as mgr0_0_, employee0_.deptno as deptno0_0_, employee0_.job as job0_0_, employee0_.sal as sal0_0_, employee0_.comm as comm0_0_, employee0_.hiredate as hiredate0_0_ from emp employee0_ where employee0_.EMPNO=?
Exception in thread "main" org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of com.raj.java.hiberanteDemos.Employee.setMgr
	at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:215)
	at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:185)
	at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3232)
	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
	at org.hibernate.loader.Loader.doQuery(Loader.java:717)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
	at org.hibernate.loader.Loader.loadEntity(Loader.java:1785)
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:47)
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:41)
	at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
	at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
	at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
	at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
	at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
	at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
	at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
	at org.hibernate.impl.SessionImpl.get(SessionImpl.java:799)
	at org.hibernate.impl.SessionImpl.get(SessionImpl.java:792)
	at com.raj.java.hiberanteDemos.FetchTest.main(FetchTest.java:13)
Caused by: net.sf.cglib.beans.BulkBeanException
	at com.raj.java.hiberanteDemos.Employee$$BulkBeanByCGLIB$$142cfd75.setPropertyValues(<generated>)
	at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:212)
	... 19 more
Caused by: java.lang.NullPointerException
	... 21 more
&#13;
&#13;
&#13;

我的emp表数据

EmpData

当我用0或其他值更新所有空值时,它工作正常。

请帮我解决错误而不更新数据库表中的空值。

先谢谢, 拉吉

3 个答案:

答案 0 :(得分:2)

我个人建议实际上&#34;清洁&#34;数据库值,可能设置列不可为空。

但如果不能这样做,你可以做的就是修改你的setter,以便它检查null

public void setComm(Double comm) {
    if(null != comm){
        this.comm = comm;

    }else{
        this.comm = 0;
    }
}

希望这会有所帮助

答案 1 :(得分:0)

您的mgr-Property是 int ,它不允许 null 。将其更改为 Integer ,允许 null 。或者为mgr列设置默认值。

答案 2 :(得分:0)

避免Hibernate尝试将null值设置为基元的最佳方法是使用Wrapper类(Integer,Long,Double ...);尤其是如果您需要在现有表格上添加一列或2。自动装箱是您的朋友。