如何处理Hibernate应用程序中的数据库空值? [英] How to handle database null values in Hibernate Application?

查看:118
本文介绍了如何处理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;私人字符串ename,工作;私人双人沙发,通信;私人日期; 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'?>< snippet-code>

 

employee.hbm.xml


$ b

<?xml version ='1.0' encoding ='UTF-8'?><!DOCTYPE hibernate-mapping PUBLIC - // Hibernate / Hibernate Mapping DTD 3.0 // ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd ><休眠映射> <! - < class name =com.javatpoint.mypackage.Employeetable =employee> < id name =empid> < generator class =assigned>< / generator> < / ID> < property name =firstName>< / property> < property name =lastName>< / property> < /类> - > < class name =com.raj.java.hiberanteDemos.Employeetable =emp> < id name =empnotype =intcolumn =EMPNO> < generator class =increment/> < / ID> < property name =enametype =java.lang.String/> < property name =mgrtype =int/> < property name =deptnumbertype =intcolumn =deptno/> < property name =jobtype =java.lang.String/> < property name =saltype =double/> < property name =commtype =double/> < property name =hiredatetype =java.sql.Date/> < / class>< / hibernate-mapping>




$ b

log4j:WARN否log4j:WARN请正确初始化log4j系统.Hibernate:选择employee0_.EMPNO作为EMPNO0_0_,employee0_.ename作为ename0_0_,employee0_.mgr作为mgr0_0_,employee0_.deptno作为记录器(org.hibernate.cfg.Environment) 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 =?线程main中的异常org.hibernate.PropertyAccessException:异常设置属性CGLIB的值(设置hibernate.cglib.use_reflection_optimizer = false获取更多信息)setter of com.raj.java.hiberan在org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:215)上的teDemos.Employee.setMgr位于org.hibernate.tuple.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:185)位于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 .org中的org.hibernate.loader.loader.loader.loader.java:1785)在org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)上的.doQuery(Loader.java:717)。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)在org.hibernate.event.def.DefaultLoadEve ntListener.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)导致:com.raj.java.hiberanteDemos.Employee上的net.sf.cglib.beans.BulkBeanException $$ org.hibernate.tuple.PojoEntityTuplizer上的BulkBeanByCGLIB $$ 142cfd75.setPropertyValues(< generated>) .setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:212)... 19 moreCaused by:java.lang.NullPointerException。 .. 21 more



我的emp表数据





<当我更新所有空值0或其他值的工作正常。



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

在此先感谢,
Raj

解决方案

我个人建议实际清理数据库值,也许将列设置为不可为空。 / p>

但是如果做不到这一点,你可以做的是修改你的setters,以便它检查 null
编辑:
因为double是一个原语,试着将它包装到 Double object

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

} else {
this.comm = 0;
}
}

希望这可以帮助您


I am getting " org.hibernate.PropertyAccessException" due to null values in my database table. How to handle the exception?

My files are

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>

employee.hbm.xml

<?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>

When I ran this application I am getting below error message.

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

my emp table data

when I update all the null values with 0 or some other values its working fine.

Please help me in solving the error without updating null values in database table.

Thanks in Advance, Raj

解决方案

I would personally recommend to actually "clean" the database values, maybe setting the column not nullable.

But if this can't be done, what you can do is modify your setters, so that it checks for null

EDIT: since double is a primitive, try to wrap it to a Double object

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

    }else{
        this.comm = 0;
    }
}

hope this helps

这篇关于如何处理Hibernate应用程序中的数据库空值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆