ネイティブな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;
}
}
なぜカスタムインサートのようなものが存在するのでしょうか? – Xorty
@Xorty:特定のケースでHibernateが期待する順序に挿入ステートメントを適合させる必要があるということです。 – axtavt
このような? (@、MD5(?)) – Xorty