2012-02-27 20 views
5

Hibernateの私の最初のアプリで作業している間。TypeMismatchException指定されたIDが間違ったタイプのもの

org.hibernate.TypeMismatchException: クラスorg.cw.form.Userのために間違った型のIDを提供し、DBからユーザーオブジェクトを取得しようとしたとき、私は次の例外を取得しています。予想されるクラス:クラスjava.lang.Integer、クラスを取得 java.lang.String at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:109) at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl .javaファイル:私が作成したorg.hibernate.impl.SessionImpl.load org.hibernate.impl.SessionImpl.loadで(SessionImpl.java:823) (SessionImpl.java:816)

で906) 次のpostgreSQLを持つUSERSテーブル:

CREATE SEQUENCE user2_id_seq; (ID)NOT NULLNULLデフォルト値nextval( 'user2_id_seq')、user_name varchar(45)NOT NULL ユニークなパスワードvarchar(45)NOT NULL、電子メールvarchar(45)NOT NULL、PRIMARY KEY(ID)) ;

とユーザーエンティティは、次のように定義されます(名前は= "USERS")

@Entity @Tableパブリッククラスユーザー{

@Id 
@Column(name="ID") 
@GeneratedValue(strategy= GenerationType.IDENTITY) 
private Integer id; 

@Column(name="USER_NAME", unique = true) 
private String userName; 

@Column(name="PASSWORD") 
private String password; 

@Column(name="EMAIL") 
private String email; .. all the getters and setters... 

私は、私は何かが欠けています?

答えて

5

あなたがどのようにユーザーを取得するかを表示すると簡単になります。

Provided id of the wrong type for class org.cw.form.User. 
Expected: class java.lang.Integer, got class java.lang.String 

私はあなたの代わりに正しいタイプ(整数)の文字列を提供している推測:あなたの問題の

String userID = "1"; //Should be Integer userID = 1 instead 
session.get(User.class, userID); 
+0

ちょっと働いた。ありがとう。 – special0ne

2

それはあなたの問題を解決しますならば、私は本当に知りませんが、あなたは、DB側のIDを生成するためにシーケンスを使用しているので、私はあなたがシーケンスジェネレータを使用すべきだと思う:

@Id 
@Column(name="ID") 
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="user2_id_seq") 
private Integer id; 

ご覧ください。この投稿は、詳細についてはHibernate sequence on oracle, @GeneratedValue(strategy = GenerationType.AUTO)

2
public User findClientByUsername(String login) {   
     Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class); 
     criteria.add(Restrictions.like("userName", login)); 
     return (User) criteria.uniqueResult(); 
    } 

ソリューションメッセージに基づいています。

1

私はこの問題を引き起こした別の原因がありました。私は、主キータイプとしてStringを使用している別のエンティティのリポジトリをコピー貼り付けました。

だから私は、エラーメッセージを生成

interface MyEntityRepository extends CrudRepository<MyEntity, String> { 

との組み合わせで

class MyEntity implements Serializable { 

    @Id 
    Integer id 

を持っていました。

インターフェイスタイプを文字列から整数に変更するだけで問題が解決しました。

関連する問題