java - 不一致的数据类型 : expected NUMBER got BINARY

标签 java oracle hibernate

我是 Hibernate 的新手,我正在尝试对我创建的 oracle 数据库进行“简单”的用户插入。

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

如果我使用 oracle sql 开发人员插入用户,我可以从 java 代码中获取该用户。但是,如果我尝试插入用户,则会出现错误:数据类型不一致:预期 NUMBER 得到二进制。

部分 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>
    ...

部分 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;
    ...

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

    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();

数据库中的用户表:

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

最佳答案

我找到了真正的问题,所以我可以解决它!

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

修复:我已将映射规则添加到 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>
    ...

它也适用于 Date 类型,而不仅仅是 Calender(也许还有更多我没有尝试过的类型)。

结论:不应该依靠自动生成机制。

关于java - 不一致的数据类型 : expected NUMBER got BINARY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14077721/

相关文章:

java - 模拟接口(interface)为空

database - 数据库中的位图索引不能加快查询速度

database - 创建Oracle临时表的DDL是否提交事务?

database - Oracle 数据库的默认用户名和密码

java - Hibernate不保存对象

java - Hibernate - 对于非抽象类,但子类可能不需要表,我应该使用哪种继承策略

java - Java 8 固定线程池总是创建固定数量的线程吗?

java - Hibernate 难以处理 HQL 中的 '@' 字符

java - 如何使用 @PathVariable 到 Pojo?

java - hibernate 事务没有正确回滚