2012-12-29 47 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; 
相關問題