5

私はHibernateを初めて使用し、作成したOracleデータベースに「単純な」ユーザー挿入を行おうとしています。

Netbeans Hibernateウィザードを使用して必要なすべてのファイルを作成しました:hibernate.cfg.xml、hibernate、reveng.xml、Users.hbm.xml、Users.java

oracle sql開発者にユーザーを挿入すると、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>
    ...

部分的な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
4

4 に答える 4

11

私は本当の問題を見つけたので、それを解決することができました!

実際の問題:テーブルには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>
    ...

カレンダーだけでなく、日付型でも機能します(おそらく私が試していなかったより多くの型)。

結論:自動生成メカニズムを中継するべきではありません。

于 2012-12-29T13:27:02.333 に答える
6

@Columnこの問題は、アノテーション付きのオブジェクトタイププロパティを宣言するときに発生する可能性があります。

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

@JoinColumn注釈付きで宣言する必要があります。

@ManyToOne
@JoinColumn(name="job_category")
private MiscTypeSetup jobCategory;
于 2017-10-04T06:43:38.227 に答える
1

フィールドの1つがnull値であるエンティティを誤って永続化しようとしたときに、このエラーを以前に受け取りました。

于 2016-05-10T19:49:10.363 に答える
0

代わりに、データ型としてLongを使用してください。それは役立つかもしれません。

private Long userid;
于 2012-12-29T03:29:14.413 に答える