我是Hibernate的新手,我正在尝试对我创建的oracle数据库进行“简单”的用户插入。
我使用Netbeans Hibernate向导创建了所有必需的文件: hibernate.cfg.xml,hibernate,reveng.xml,Users.hbm.xml,Users.java
如果我使用oracle sql developer插入用户,我可以从java代码中获取此用户。但是,如果我试图插入用户,我会收到错误:数据类型不一致:预期NUMBER有BINARY。
Partial 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
答案 0 :(得分: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>
...
它也适用于日期类型而不仅仅是日历(可能更多类型我没试过)。
结论:不应该继续使用自动生成机制。
答案 1 :(得分:4)
当我们声明带有@Column
注释的Object类型属性时,可能会发生此问题。
@Column(name="job_category")
private MiscTypeSetup jobCategory;
我们应该使用@JoinColumn
注释声明。
@ManyToOne
@JoinColumn(name="job_category")
private MiscTypeSetup jobCategory;
答案 2 :(得分:1)
我在意外尝试持有其中一个字段为空值的实体之前收到此错误。
答案 3 :(得分:0)
使用Long作为数据类型。这可能有所帮助。
private Long userid;