Hibernate - странный порядок собственных параметров SQL - PullRequest
4 голосов
/ 06 января 2011

Я пытаюсь использовать криптографическую функцию MD5 в MySQL, поэтому я определил пользовательскую вставку в своем файле отображения.

<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>

Затем я создаю пользователя (довольно простой 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 и хранится как пароль.

Что я не так сделал? Спасибо

РЕДАКТИРОВАТЬ: ДОБАВЛЕНИЕ 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;
    }


}

1 Ответ

4 голосов
/ 06 января 2011

Из документов :

Порядок параметров важен и определяется порядком свойств свойств Hibernate.Вы можете увидеть ожидаемый порядок, включив ведение журнала отладки для уровня org.hibernate.persister.entity.Если этот уровень включен, Hibernate будет распечатывать статический SQL, который используется для создания, обновления, удаления и т. Д. Объектов.(Чтобы увидеть ожидаемую последовательность, не забудьте не включать свой собственный SQL через аннотации или файлы сопоставления, так как это заменит статический sql, сгенерированный Hibernate)

Похоже, что нет способа предсказать этот порядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...