【问题标题】:inconsistent datatypes: expected NUMBER got BINARY不一致的数据类型:预期 NUMBER 得到 BINARY
【发布时间】:2012-12-29 00:58:34
【问题描述】:

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

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

如果我使用 oracle sql developer 插入用户,我可以从 java 代码中获取该用户。但是,如果我尝试插入用户,则会收到错误消息:不一致的数据类型:预期的 NUMBER 得到了 BINARY。

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

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

【问题讨论】:

    标签: java oracle hibernate


    【解决方案1】:

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

    真正的问题:表有TIMESTAMP字段,hibernate将它们生成为Serializable,这会产生错误,因为Serializable is not a 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(可能还有更多我没有尝试过的类型)。

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

    【讨论】:

    • 您可以接受自己的答案来获得声望点数。您希望在左上边距之外的“计数器”(当前为 0)的复选标记。祝你好运。
    【解决方案2】:

    当我们用@Column注解声明一个Object类型的属性时,可能会出现这个问题。

    @Column(name="job_category")
    private MiscTypeSetup jobCategory;
    

    我们应该用@JoinColumn注解声明。

    @ManyToOne
    @JoinColumn(name="job_category")
    private MiscTypeSetup jobCategory;
    

    【讨论】:

      【解决方案3】:

      我之前在意外尝试使用具有空值的字段之一持久化实体时收到此错误。

      【讨论】:

        【解决方案4】:

        改为使用 Long 作为数据类型。这可能会有所帮助。

        private Long userid;
        

        【讨论】:

        • 还是不行,我现在从 user.getUserid() 得到 null;意味着生成器 class="increment" 不起作用(可能是因为 Users.hbm.xml 中的用户 ID 是“int”类型,我尝试将其更改为其他类型,然后我再次收到不一致的数据类型错误)。我不明白一些事情,我没有创建它是用休眠自动生成的用户类,所以我为什么需要在这个类中进行更改,它不应该创建具有尊重数据库表的正确类型的用户类?
        猜你喜欢
        • 2014-06-06
        • 2021-09-08
        • 2019-05-04
        • 2017-04-21
        • 2017-11-26
        • 1970-01-01
        • 2019-08-25
        • 1970-01-01
        • 2017-12-28
        相关资源
        最近更新 更多