2012-12-29 46 views
3

我是Hibernate的新手,我试图对我创建的Oracle数据库执行“简单”用户插入操作。不一致的数据类型:预计NUMBER得到BINARY

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

如果我插入用户用的Oracle SQL Developer ,我可以从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 

回答

7

我发现了真正的问题,所以我可以解决它!

真正的问题:表具有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类型不只是日历(也许更多类型我没有尝试)。

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

+2

你可以接受你自己的答案来获得声望点。您需要在'左'边缘以外的'counter'(当前为0)选中复选标记。祝你好运。 – shellter

0

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

private Long userid; 
+0

还是不行,我现在从user.getUserid()获得null;这意味着生成器类=“增量”不起作用(可能是因为Users.hbm.xml中的userid是“int”类型,我试图将其更改为其他类型,然后再次获得不一致的数据类型错误)。 我不明白,我没有创建Users类,它是用hibernate自动生成的,所以我怎么需要在这个类中进行修改,它不是假设创建Users类的类型是尊重数据库表的正确类型? – GoldenAxe

0

我以前收到这个错误时,意外地试图坚持一个实体的空值之一的字段。

0

当我们使用@Column注释声明对象类型属性时,可能会发生此问题。我们应该用@JoinColumn注释。

@ManyToOne 
@JoinColumn(name="job_category") 
private MiscTypeSetup jobCategory; 
相关问题