2011-01-06 15 views
4

ネイティブなMySQLのMD5暗号関数を使用しようとしています。そのため、マッピングファイルにカスタム挿入を定義しました。Hibernate - ネイティブSQLパラメータの奇妙な順序

<hibernate-mapping package="tutorial"> 
    <class name="com.xorty.mailclient.client.domain.User" table="user"> 
    <id name="login" type="string" column="login"></id> 
    <property name="password"> 
     <column name="password" /> 
    </property> 
    <sql-insert>INSERT INTO user (login,password) VALUES (?, MD5(?))</sql-insert> 
    </class> 
</hibernate-mapping> 

次に、ユーザ(2つの文字列だけの非常に単純なPOJO - ログインとパスワード)を作成し、それを永続化しようとします。

session.beginTransaction(); 
// we have no such user in here yet 
User junitUser = (User) session.load(User.class, "junit_user"); 
assert (null == junitUser); 
// insert new user 
junitUser = new User(); 
junitUser.setLogin("junit_user"); 
junitUser.setPassword("junitpass"); 
session.save(junitUser); 
session.getTransaction().commit(); 

実際にはどうなりますか?

ユーザーは作成されましたが、が反転されたのパラメータの順序で作成されます。彼はログイン「junitpass」を持ち、「junit_user」はMD5を暗号化してパスワードとして保存します。

何が間違っていましたか?おかげ

EDIT:docsからADDING POJOクラス

package com.xorty.mailclient.client.domain; 

import java.io.Serializable; 

/** 
* POJO class representing user. 
* @author MisoV 
* @version 0.1 
*/ 
public class User implements Serializable { 

    /** 
    * Generated UID 
    */ 
    private static final long serialVersionUID = -969127095912324468L; 
    private String login; 
    private String password; 

    /** 
    * @return login 
    */ 
    public String getLogin() { 
     return login; 
    } 

    /** 
    * @return password 
    */ 
    public String getPassword() { 
     return password; 
    } 

    /** 
    * @param login the login to set 
    */ 
    public void setLogin(String login) { 
     this.login = login; 
    } 

    /** 
    * @param password the password to set 
    */ 
    public void setPassword(String password) { 
     this.password = password; 
    } 

    /** 
    * @see java.lang.Object#toString() 
    * @return login 
    */ 
    @Override 
    public String toString() { 
     return login; 
    } 

    /** 
    * Creates new User. 
    * @param login User's login. 
    * @param password User's password. 
    */ 
    public User(String login, String password) { 
     setLogin(login); 
     setPassword(password); 
    } 

    /** 
    * Default constructor 
    */ 
    public User() { 
    } 

    /** 
    * @return hashCode 
    * @see java.lang.Object#hashCode() 
    */ 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((null == login) ? 0 : login.hashCode()); 
     result = prime * result 
       + ((null == password) ? 0 : password.hashCode()); 
     return result; 
    } 

    /** 
    * @param obj Compared object 
    * @return True, if objects are same. Else false. 
    * @see java.lang.Object#equals(java.lang.Object) 
    */ 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj == null) { 
      return false; 
     } 
     if (!(obj instanceof User)) { 
      return false; 
     } 
     User other = (User) obj; 
     if (login == null) { 
      if (other.login != null) { 
       return false; 
      } 
     } else if (!login.equals(other.login)) { 
      return false; 
     } 
     if (password == null) { 
      if (other.password != null) { 
       return false; 
      } 
     } else if (!password.equals(other.password)) { 
      return false; 
     } 
     return true; 
    } 


} 

答えて

2

パラメータの順序は重要であり、Hibernateがプロパティを処理する順序によって定義されます。 org.hibernate.persister.entityレベルのデバッグログを有効にすると、予想される順序がわかります。このレベルを有効にすると、Hibernateは、エンティティの作成、更新、削除などに使用される静的SQLを出力します。 (予想されるシーケンスを見るには、カスタムSQLを注釈やマッピングファイルに含めないでください.Hibernateで生成された静的SQLをオーバーライドするようにしてください)

その順序を予測する方法はないようです。

+0

なぜカスタムインサートのようなものが存在するのでしょうか? – Xorty

+0

@Xorty:特定のケースでHibernateが期待する順序に挿入ステートメントを適合させる必要があるということです。 – axtavt

+0

このような? (@、MD5(?)) – Xorty

関連する問題