2016-07-05 119 views
0

我尝试使用Hibernate在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; 
} 
} 

ID生成类:

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的正确方法。感谢,如果有人能给我一个例子。下面的代码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

感谢您的建议。将会设置一个默认的字符长度。 – 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)