2015-01-11 3 views
0

Я пытаюсь вставить зашифрованный пароль в таблицу UserProfile.Усечение данных: данные для столбца

My SQL файл для создания таблиц это как:

-- ---------- Table for validation queries from the connection pool. ---------- 
DROP TABLE PingTable; 
CREATE TABLE PingTable (foo CHAR(1)); 
-- ------------------------------ UserProfile ---------------------------------- 
DROP TABLE UserProfile; 
CREATE TABLE UserProfile (
    usrId BIGINT NOT NULL AUTO_INCREMENT, 
    loginName VARCHAR(30) COLLATE latin1_bin NOT NULL, 
    enPassword VARCHAR(150) NOT NULL, 
    firstName VARCHAR(30) NOT NULL, 
    lastName VARCHAR(40) NOT NULL, 
    email VARCHAR(60) NOT NULL, 
    CONSTRAINT UserProfile_PK PRIMARY KEY (usrId), 
    CONSTRAINT LoginNameUniqueKey UNIQUE (loginName)) 
    ENGINE = InnoDB; 

CREATE INDEX UserProfileIndexByLoginName ON UserProfile (loginName); 

Моя реализация для регистрации пользователя:

private String doEncryptedPassword(String clearPassword) { 
    HashFunction hf = Hashing.sha512(); 
    HashCode hc = hf.newHasher(clearPassword.length()).putString(clearPassword, StandardCharsets.UTF_8).hash(); 
    return hc.toString(); 
} 

public UserProfile registerUser(String loginName, String clearPassword, 
     UserProfileDetails userProfileDetails) 
     throws DuplicateInstanceException { 

    try { 
     userProfileDao.findByLoginName(loginName); 
     throw new DuplicateInstanceException(loginName, 
       UserProfile.class.getName()); 
    } catch (InstanceNotFoundException e) { 
     String encryptedPassword = doEncryptedPassword(clearPassword); 

     UserProfile userProfile = new UserProfile(loginName, 
       encryptedPassword, userProfileDetails.getFirstName(), 
       userProfileDetails.getLastName(), userProfileDetails 
        .getEmail()); 


     userProfileDao.save(userProfile); 
     return userProfile; 
    } 

} 

UserProfile.java:

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.SequenceGenerator; 

@Entity 
public class UserProfile { 

    private Long userProfileId; 
    private String loginName; 
    private String encryptedPassword; 
    private String firstName; 
    private String lastName; 
    private String email; 

    public UserProfile() { 
    } 

    public UserProfile(String loginName, String encryptedPassword, 
      String firstName, String lastName, String email) { 

     /** 
     * NOTE: "userProfileId" *must* be left as "null" since its value is 
     * automatically generated. 
     */ 

     this.loginName = loginName; 
     this.encryptedPassword = encryptedPassword; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.email = email; 
    } 

    @Column(name = "usrId") 
    @SequenceGenerator(// It only takes effect for 
    name = "UserProfileIdGenerator", // databases providing identifier 
    sequenceName = "UserProfileSeq") 
    // generators. 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "UserProfileIdGenerator") 
    public Long getUserProfileId() { 
     return userProfileId; 
    } 
    public void setUserProfileId(Long userProfileId) { 
     this.userProfileId = userProfileId; 
    } 

    public String getLoginName() { 
     return loginName; 
    } 
    public void setLoginName(String loginName) { 
     this.loginName = loginName; 
    } 

    @Column(name = "enPassword") 
    public String getEncryptedPassword() { 
     return encryptedPassword; 
    } 
    public void setEncryptedPassword(String encryptedPassword) { 
     this.encryptedPassword = encryptedPassword; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getEmail() { 
     return email; 
    } 
    public void setEmail(String email) { 
     this.email = email; 
    } 

    @Override 
    public String toString() { 
     return "UserProfile [userProfileId=" + userProfileId + ", loginName=" 
       + loginName + ", encryptedPassword=" + encryptedPassword 
       + ", firstName=" + firstName + ", lastName=" + lastName 
        + ", email=" + email + "]"; 
    } 

} 

Ошибка сообщение:

Data truncation: Data too long for column 'enPassword' at row 1; SQL [n/a]; nested exception is org.hibernate.exception.DataException: Data truncation: Data too long for column 'enPassword' at row 1

Как решить эту проблему?

(длина строки возвращается в методе doEncryptedPassword составляет 129 символов)

ответ

0

Я нашел проблему.

У меня есть две базы данных Data and DataTest. В «Данные» все работает правильно.

В «DataTest» (база данных для выполнения теста) был этот «UserProfile» раньше с несколькими внешними ключами (причина, по которой они не удаляются).

старая таблица имеет enPassword столбца определить как

enPassword VARCHAR(30) NOT NULL 

Это причина ошибки (строки с 129 символом не может хранящуюся в колонку с 30 размером).

Чтобы решить эту проблему, чтобы удалить таблицы с внешними ключами, сделать это

SET FOREIGN_KEY_CHECKS=0; 
DROP TABLE IF EXISTS UserProfile; 
SET FOREIGN_KEY_CHECKS=1; 
0

Это исключение будет происходить, когда значение, переданное для столбца enPassword больше, чем 150 символа. Попробуйте увеличить размер enPassword колонке

Также проверьте, что длина строки возвращается в методе doEncryptedPassword

+0

если можно попробовать напечатать команду, которая передается в базу данных для выполнения. –

Смежные вопросы

 Смежные вопросы