不一致的数据类型:预期NUMBER得到BINARY

Gol*_*Axe 4 java oracle hibernate

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

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

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

部分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>
    ...
Run Code Online (Sandbox Code Playgroud)

部分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;
    ...
Run Code Online (Sandbox Code Playgroud)

部分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();
Run Code Online (Sandbox Code Playgroud)

数据库中的用户表:

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
Run Code Online (Sandbox Code Playgroud)

Gol*_*Axe 10

我找到了真正的问题因此我可以解决它!

真正的问题:表有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>
    ...
Run Code Online (Sandbox Code Playgroud)

它也适用于日期类型而不仅仅是日历(可能更多类型,我没有尝试).

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

  • 你可以接受自己的答案来获得声望点.您希望在左上边距外的"计数器"(当前为0)处选中复选标记.祝好运. (2认同)

小智 5

当我们声明带有@Column注释的对象类型属性时,可能会出现此问题。

@Column(name="job_category")
private MiscTypeSetup jobCategory;
Run Code Online (Sandbox Code Playgroud)

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

@ManyToOne
@JoinColumn(name="job_category")
private MiscTypeSetup jobCategory;
Run Code Online (Sandbox Code Playgroud)