不一致的数据类型:期望NUMBER得到BINARY [英] inconsistent datatypes: expected NUMBER got BINARY

查看:922
本文介绍了不一致的数据类型:期望NUMBER得到BINARY的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Hibernate的新手,我试图对创建的oracle数据库执行简单用户插入。



我创建了所有必需的文件使用Netbeans Hibernate向导:
hibernate.cfg.xml,hibernate,reveng.xml,Users.hbm.xml,Users.java



如果我将用户oracle sql开发者,我可以从java代码中获得这个用户。但是,如果我试图插入用户,我得到的错误:不一致的数据类型:预期NUMBER得到BINARY。



部分Users.hbm.xml:

 < hibernate-mapping> 
< class name =HibernateDB.Usersschema =SYSTEMtable =USERS>
< id name =useridtype =int>
< column name =USERIDprecision =9scale =0/>
< generator class =increment/>
< / id>
...

部分Users.java:

  public class Users实现java.io.Serializable 
{

private int userid;
私人字符串用户名;
私人字符串密码;
private String firstName;
private String lastName;
private可序列化dateOfBirth;
私有序列化注册日期;
...

部分insertUser方法(所有参数都是字符串):

  session = HibernateUtil.currentSession(); 
Transaction tx = session.beginTransaction();
日历dOfBirth = Calendar.getInstance();
dOfBirth.set(Integer.parseInt(year_of_birth),Integer.parseInt(month_of_birth),Integer.parseInt(day_of_birth));
日历regDate = Calendar.getInstance();
时间戳dOfBirthTS =新时间戳(dOfBirth.getTimeInMillis());
时间戳记regDateTS =新的时间戳记(regDate.getTimeInMillis());
用户user = new Users();
user.setUsername(username);
user.setPassword(password);
user.setFirstName(first_name);
user.setLastName(last_name);
user.setDateOfBirth(dOfBirthTS);
user.setRegistrationDate(regDateTS);
session.saveOrUpdate(user);
ans = user.getUserid();
tx.commit();

数据库中的用户表:

 USERID NUMBER(9,0) - 主键
USERNAME VARCHAR(200)
PASSWORD VARCHAR(200)
FIRST_NAME VARCAHR(200)
LAST_NAME VARCHAR(200)
DATE_OF_BIRTH TIMESTAMP
REGISTRATION_DATE TIMESTAMP


解决方案



真正的问题:表有TIMESTAMP字段,hibernate将它们生成为Serializable,它产生作为Serializable的错误不是TIMESTAMP。



解决方法:我已将映射规则添加到hibernate.reveng.xml中:

 < hibernate-reverse-engineering> 
< schema-selection match-schema =SYSTEM/>
< type-mapping>
< sql-type jdbc-type =OTHERhibernate-type =java.util.Calendar/>
< / type-mapping>
...

它也适用于Date类型不只是Calender(也许更多类型I没有试过)。



结论:不应该在自动生成机制上继续。


I'm new to Hibernate, I'm trying to do a "simple" user insertion to oracle database I have created.

I created all the necessary files with Netbeans Hibernate wizards: hibernate.cfg.xml, hibernate,reveng.xml, Users.hbm.xml, Users.java

If I insert user with the oracle sql developer, I can get this user from java code. But if I'm trying to insert a user I get the error: inconsistent datatypes: expected NUMBER got BINARY.

Partial Users.hbm.xml:

<hibernate-mapping>
  <class name="HibernateDB.Users" schema="SYSTEM" table="USERS">
    <id name="userid" type="int">
      <column name="USERID" precision="9" scale="0"/>
      <generator class="increment"/>
    </id>
    ...

Partial Users.java:

public class Users implements java.io.Serializable
{

    private int userid;
    private String username;
    private String password;
    private String firstName;
    private String lastName;
    private Serializable dateOfBirth;
    private Serializable registrationDate;
    ...

Partial insertUser method (all parameters are strings):

    session = HibernateUtil.currentSession();
    Transaction tx = session.beginTransaction();
    Calendar dOfBirth = Calendar.getInstance();
    dOfBirth.set(Integer.parseInt(year_of_birth), Integer.parseInt(month_of_birth), Integer.parseInt(day_of_birth));
    Calendar regDate = Calendar.getInstance();
    Timestamp dOfBirthTS = new Timestamp(dOfBirth.getTimeInMillis());
    Timestamp regDateTS = new Timestamp(regDate.getTimeInMillis());
    Users user = new Users();
    user.setUsername(username);
    user.setPassword(password);
    user.setFirstName(first_name);
    user.setLastName(last_name);
    user.setDateOfBirth(dOfBirthTS);
    user.setRegistrationDate(regDateTS);
    session.saveOrUpdate(user);
    ans = user.getUserid();
    tx.commit();

Users Table in the database:

USERID NUMBER(9,0) - the primary key
USERNAME VARCHAR(200)
PASSWORD VARCHAR(200)
FIRST_NAME VARCAHR(200)
LAST_NAME VARCHAR(200)
DATE_OF_BIRTH TIMESTAMP
REGISTRATION_DATE TIMESTAMP

解决方案

I have found the real problem therefore I could solve it!

Real problem: Table have TIMESTAMP fields, hibernate generate them as Serializable, which produce the error as Serializable is not a TIMESTAMP.

Fix: I have add a mapping rule to hibernate.reveng.xml:

<hibernate-reverse-engineering>
  <schema-selection match-schema="SYSTEM"/>
    <type-mapping> 
        <sql-type jdbc-type="OTHER" hibernate-type="java.util.Calendar" /> 
    </type-mapping>
    ...

it also work's with Date type not just Calender (maybe more types I didn't try).

Conclusion: shouldn't relay on auto generating mechanism.

这篇关于不一致的数据类型:期望NUMBER得到BINARY的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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