2016-07-05 2 views
0

최대 절전 모드를 사용하여 MySQL에서 GUID/UUID 생성을 시도했습니다. 아래는 동일한 코드입니다. 누구나 내가 잘못 가고있는 것을 제안 해 주시겠습니까?UUID를 생성 할 수 있지만 데이터베이스에 삽입 할 수 없습니다.

 public class MainClassLists { 
     public static void main(String[] args){ 

     Configuration configuration = new Configuration().configure(); 
     ServiceRegistryBuilder registry = new ServiceRegistryBuilder(); 
     registry.applySettings(configuration.getProperties()); 
     ServiceRegistry serviceRegistry = registry.build(); 
     SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 

     Session session = sessionFactory.openSession(); 
     Users userNew = new Users(); 
        userNew.setUserName("StyuytSra"); 
     userNew.setPassword("pyuass"); 
     userNew.setFirstName("sryuyaxcva"); 
     userNew.setLastName("sayuynxca"); 
     userNew.setBirthDate("2000-08-12"); 
     userNew.setGender("f"); 
     userNew.setEmailId("[email protected]");   
     userNew.setPhoneNumber(92672); 
     userNew.setAccountNumber(8878); 
     userNew.setAddress1("add1"); 
     userNew.setAddress2("add2"); 
     userNew.setCity("SD"); 
     userNew.setCountry("US"); 
     userNew.setZipcode(765); 
     session.beginTransaction(); 
     session.save(userNew); 
     Serializable uid= session.getIdentifier(userNew); 

     System.out.println("User ID : "+userNew.getUserId()+""+uid); 
       System.out.println(); 
     session.close(); 
     System.exit(0); 
    } 
    } 

엔티티 클래스 :

@Entity 
    @Table(name = "users", catalog = "test", schema = "") 
public class Users implements Serializable { 
    @Id 
@Column(name = "user_id") 

@GeneratedValue(generator = "GUID") 
@GenericGenerator(name = "GUID", strategy = "com.List_Test.mainClass.InquisitiveUUIDGenerator") 

private String userId; 
@Basic(optional = false) 
@Column(name = "user_name", unique = true) 
private String userName; 
@Basic(optional = false) 
@Column(name = "password") 
private String password; 
@Basic(optional = false) 
@Column(name = "first_name") 
private String firstName; 
@Basic(optional = false) 
@Column(name = "last_name") 
private String lastName; 
@Column(name = "birth_date") 
private String birthDate; 
@Column(name = "gender") 
private String gender; 
@Column(name = "email_id", unique = true) 
private String emailId; 
@Column(name = "phone_number") 
private Integer phoneNumber; 
@Column(name = "account_number", unique = true) 
private Integer accountNumber; 
@Column(name = "address_1") 
private String address1; 
@Column(name = "address_2") 
private String address2; 
@Column(name = "city") 
private String city; 
@Column(name = "state") 
private String state; 
@Column(name = "zipcode") 
private Integer zipcode; 
@Column(name = "country") 
private String country; 
public String getUserId() { 
    return userId; 
} 

public void setUserId(String userId) { 
    this.userId = userId; 
} 

public String getUserName() { 
    return userName; 
} 

public void setUserName(String userName) { 
    this.userName = userName; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

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 getBirthDate() { 
    return birthDate; 
} 

public void setBirthDate(String birthDate) { 
    this.birthDate = birthDate; 
} 

public String getGender() { 
    return gender; 
} 

public void setGender(String gender) { 
    this.gender = gender; 
} 

public String getEmailId() { 
    return emailId; 
} 

public void setEmailId(String emailId) { 
    this.emailId = emailId; 
} 

public Integer getPhoneNumber() { 
    return phoneNumber; 
} 

public void setPhoneNumber(Integer phoneNumber) { 
    this.phoneNumber = phoneNumber; 
} 

public Integer getAccountNumber() { 
    return accountNumber; 
} 

public void setAccountNumber(Integer accountNumber) { 
    this.accountNumber = accountNumber; 
} 

public String getAddress1() { 
    return address1; 
} 

public void setAddress1(String address1) { 
    this.address1 = address1; 
} 

public String getAddress2() { 
    return address2; 
} 

public void setAddress2(String address2) { 
    this.address2 = address2; 
} 

public String getCity() { 
    return city; 
} 

public void setCity(String city) { 
    this.city = city; 
} 

public String getState() { 
    return state; 
} 

public void setState(String state) { 
    this.state = state; 
} 

public Integer getZipcode() { 
    return zipcode; 
} 

public void setZipcode(Integer zipcode) { 
    this.zipcode = zipcode; 
} 

public String getCountry() { 
    return country; 
} 

public void setCountry(String country) { 
    this.country = country; 
} 
} 

아이디 생성기 클래스 : 또한

public class InquisitiveUUIDGenerator extends UUIDGenerator { 

private String entityName; 

public void configure(Type type, Properties params, Dialect dialect) { 
    entityName = params.getProperty(ENTITY_NAME); 
    super.configure((org.hibernate.type.Type) type, params, dialect); 
} 

@Override 
public Serializable generate(SessionImplementor session, Object object) { 
    Serializable id = session 
      .getEntityPersister(entityName, object) 
      .getIdentifier(object, session); 

    if (id == null) { 
     return super.generate(session, object); 
    } else { 
     return id; 
    } 
} 
} 

, 나는 사용자의 테이블에 대해 MySQL 데이터베이스에 삽입하기 전에 트리거를 갖는 데이터를 삽입 시도하고 매핑을 시도 그것을 엔티티 클래스에 전달한다. 내가 매핑했지만 생성기에 키를 부여하는 @NaturalId (고유) 키는 고유하지 않습니다. 따라서 중복 된 매핑이 생성됩니다. GUID 또는 UUID를 생성하는 올바른 방법이 무엇인지 혼란 스럽습니다. 누군가가 내게 모범을 보여줄 수 있다면 감사하게 생각해. 아래 표의 ID DB 스크립트

CREATE TABLE `users` (
`user_id` varchar(36) NOT NULL, 
`user_name` varchar(20) NOT NULL, 
`password` varchar(25) NOT NULL, 
`first_name` varchar(25) NOT NULL, 
`last_name` varchar(25) NOT NULL, 
`birth_date` varchar(100) DEFAULT NULL, 
`gender` varchar(15) DEFAULT NULL, 
`email_id` varchar(50) DEFAULT NULL, 
`phone_number` int(10) DEFAULT NULL, 
`account_number` int(8) DEFAULT NULL, 
`address_1` varchar(50) DEFAULT NULL, 
`address_2` varchar(50) DEFAULT NULL, 
`city` varchar(15) DEFAULT NULL, 
`state` varchar(2) DEFAULT NULL, 
`zipcode` int(8) DEFAULT NULL, 
`country` varchar(15) DEFAULT NULL, 
PRIMARY KEY (`user_id`), 
UNIQUE KEY `user_name` (`user_name`), 
UNIQUE KEY `email_id` (`email_id`), 
UNIQUE KEY `phone_number` (`phone_number`), 
UNIQUE KEY `account_number` (`account_number`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

제공되는 코드가 성공적으로 컴파일되어 실행됩니다. ID는 생성되지만 데이터베이스 테이블에는 삽입되지 않습니다. '사용자 ID : ab9ffdb1-67ba-4d14-9038-3901d5032ab5ab9ffdb1-67ba-4d14-9038-3901d5032ab5'

+0

이러한 문자열 제한 중 많은 수가 실제로 너무 빡빡하고 완전히 무작위 적으로 보입니다. 이름에 대한 글자 25 글자는 적절하지 않으며 주소지의 경우 50 글자이지만 생년월일의 경우 100 글자가 너무 큰 것처럼 보입니다. 이를 위해'DATE' 필드를 사용하십시오. 정말로 강력한 이유가없는 한, 대부분의 컬럼은 디폴트로'VARCHAR (255)'이어야한다. 마찬가지로, 우편 번호에'int'를 사용하는 것은 문제가 될 것입니다 : "10001-1010"은 유효한 미국 우편 번호입니다. 불필요하게 단속하고 데이터를 잘라 버리는 것보다 열린 상태로 두는 것이 좋습니다. – tadman

+0

제안 해 주셔서 감사합니다. 디폴트의 ​​char 길이가됩니다. – user5876453

답변

0

대신 내 질문에서 언급 한 바와 같이 (UUID를 생성하기위한 별도의 클래스를 가진 출력은 다음과 같이 될 것이다) 나는 다른 스택 오버 플로우 해답에서 찾은 주석 아래에 사용했다. 세션 트랜잭션을 시작하고 끝내는 것을 잊어 버리기 때문에 일찍 시도했지만 작동하지 않았습니다. GUID를 생성하고 있지만 데이터베이스에 저장되지 않았습니다. 트랜잭션을 저장하려면 트랜잭션을 커밋해야했습니다. 아래 코드는 ID에 대해 주석을 달아야합니다.

@Id 
@GeneratedValue(generator = "system-uuid") 
@GenericGenerator(name = "system-uuid", strategy = "org.hibernate.id.GUIDGenerator") 
@Column(name = "user_id", unique = true) 
관련 문제