论坛首页 Java企业应用论坛

关于Hibernate Annotations 用户自定义类型的问题

浏览 3045 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-08  

小弟是想问关于Hibernate Annotations 用户自定义类型的问题,我在做插入操作的时候,数据就可以正确的插入到数据库中;但是执行查询操作的时候,就出现错误了,SQL语句可以出来的,也是可以在PL/SQL中正确执行,异常如下:

    Hibernate: select customers_0_.id as id7_0_, customers_0_.COM_STREET as COM2_7_0_, customers_0_.COM_CITY as COM3_7_0_, customers_0_.COM_PROVINCE as COM4_7_0_, customers_0_.COM_ZIPCODE as COM5_7_0_, customers_0_.HOME_STREET as HOME6_7_0_, customers_0_.HOME_CITY as HOME7_7_0_, customers_0_.HOME_PROVINCE as HOME8_7_0_, customers_0_.HOME_ZIPCODE as HOME9_7_0_, customers_0_.sex as sex7_0_, customers_0_.phone as phone7_0_, customers_0_.FIRSTNAME as FIRSTNAME7_0_, customers_0_.LASTNAME as LASTNAME7_0_ from CUSTOMERS_USERTYPE customers_0_ where customers_0_.id=?

---------------------------SQL可以打出来了,可以在PL/SQL里面执行
10:41:23,125  WARN JDBCExceptionReporter:71 - SQL Error: 17024, SQLState: null
10:41:23,125 ERROR JDBCExceptionReporter:72 - 未读取数据
10:41:23,140  INFO DefaultLoadEventListener:109 - Error performing load command
org.hibernate.exception.GenericJDBCException: could not load an entity: [com.usertype.forms.Customers_UserType#7]
 at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
 at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
 at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
 at org.hibernate.loader.Loader.loadEntity(Loader.java:1798)
 at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
 at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
 at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2977)
 at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:393)
 at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:374)
 at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:137)
 at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:193)
 at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:101)
 at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
 at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815)
 at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808)
 at org.springframework.orm.hibernate3.HibernateTemplate$1.doInHibernate(HibernateTemplate.java:460)
 at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:362)
 at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:454)
 at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:448)
 at com.usertype.dao.Customers_UserTypeImpDao.getCustomers_UserType(Customers_UserTypeImpDao.java:18)
 at com.hibernate.Customers_UserTypeServices.showCustomers_UserType(Customers_UserTypeServices.java:59)
 at com.hibernate.Main.main(Main.java:48)
Caused by: java.sql.SQLException: 未读取数据
 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
 at oracle.jdbc.driver.OracleStatement.wasNullValue(OracleStatement.java:3174)
 at oracle.jdbc.driver.OracleResultSetImpl.wasNull(OracleResultSetImpl.java:127)
 at com.usertype.AddressUserType.nullSafeGet(AddressUserType.java:53)
 at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:105)
 at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81)
 at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2031)
 at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1371)
 at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1299)
 at org.hibernate.loader.Loader.getRow(Loader.java:1197)
 at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:568)
 at org.hibernate.loader.Loader.doQuery(Loader.java:689)
 at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
 at org.hibernate.loader.Loader.loadEntity(Loader.java:1784)
 ... 18 more


 

我的部分代码如下:

1.POJO

package com.usertype.forms;

import java.io.Serializable;

import javax.persistence.*;
import org.hibernate.annotations.*;

/**
 *@project clustering
 *@author xuchao
 *@create_date 2008-3-6
 *@description
 */
@SuppressWarnings("serial")
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate=true)
@Table(name="CUSTOMERS_USERTYPE")
@SequenceGenerator(name="CUSTOMERS_USERTYPE_SEQ",sequenceName="CUSTOMERS_USERTYPE_SEQ")
public class Customers_UserType implements Serializable {
 private Integer id;

    private Name name;

    private Address homeAddress;

    private Address comAddress;

    private Gender gender;

    private Integer phone;

    /** full constructor */
    public Customers_UserType(Name name, Address homeAddress, Address comAddress,Gender gender,Integer phone) {
        this.name = name;
        this.homeAddress = homeAddress;
        this.comAddress = comAddress;
        this.gender=gender;
        this.phone=phone;
    }


    public Customers_UserType() {
    }

    @Type(type="com.usertype.AddressUserType")
 @Columns(columns = {
   @Column(name="COM_STREET",length=30),
   @Column(name="COM_CITY",length=30),
   @Column(name="COM_PROVINCE",length=30),
   @Column(name="COM_ZIPCODE",length=30)
 })
 public Address getComAddress() {
  return comAddress;
 }


 public void setComAddress(Address comAddress) {
  this.comAddress = comAddress;
 }

 @Type(type = "com.usertype.GenderUserType")
 @Column(name="sex",length=1)
 public Gender getGender() {
  return gender;
 }


 public void setGender(Gender gender) {
  this.gender = gender;
 }

 

 @Type(type="com.usertype.AddressUserType")
 @Columns(columns = {
   @Column(name="HOME_STREET",length=30),
   @Column(name="HOME_CITY",length=30),
   @Column(name="HOME_PROVINCE",length=30),
   @Column(name="HOME_ZIPCODE",length=30)
 })
 public Address getHomeAddress() {
  return homeAddress;
 }


 public void setHomeAddress(Address homeAddress) {
  this.homeAddress = homeAddress;
 }

 @Id
 @GeneratedValue(generator="CUSTOMERS_USERTYPE_SEQ")
 public Integer getId() {
  return id;
 }


 public void setId(Integer id) {
  this.id = id;
 }

 @Type(type="com.usertype.NameCompositeUserType")
 @Columns(columns = {
   @Column(name="FIRSTNAME",length=30),
   @Column(name="LASTNAME",length=30)
 })
 public Name getName() {
  return name;
 }


 public void setName(Name name) {
  this.name = name;
 }

 @Type(type = "com.usertype.PhoneUserType")
 @Column(name="phone",length=20)
 public Integer getPhone() {
  return phone;
 }


 public void setPhone(Integer phone) {
  this.phone = phone;
 }

}

 

2. DAO

package com.usertype.dao;

import java.io.Serializable;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.usertype.forms.Customers_UserType;

/**
 *@project clustering
 *@author xuchao
 *@create_date 2008-3-6
 *@description
 */
public class Customers_UserTypeImpDao extends HibernateDaoSupport implements
  Customers_UserTypeDao {
 

/*错误就在这里,执行Get方法的时候,报错*/
 public Customers_UserType getCustomers_UserType(Serializable id) {
  return (Customers_UserType) getHibernateTemplate().get(Customers_UserType.class, id);
 }
 

/*在做插入操作的时候,就可以正常执行.*/
 public void insertCustomers_UserType(Customers_UserType customers_UserType) {
  getHibernateTemplate().save(customers_UserType);
 }
 }

   发表时间:2008-03-09  
我个人认为,你这个POJO在设计上存在问题。

1. phone 是 Integer,不需要使用Type
2. Address建议使用@Embeddable和@Embedded

具体关于这些annotations可参阅"Hibernate 3和Java Persistence API 程序开发从入门到精通"一书
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics