2015-09-07 68 views
0
// Auto generation 
public abstract class BaseEntity implements Serializable { 
    @Id 
    @GeneratedValue(generator = "uuid") 
    @GenericGenerator(name = "uuid", strategy = "uuid2") 
    @Column(name = "id", unique = true) 
    private UUID id; 

} 

// Custom assignment 
public abstract class BaseEntity implements Serializable { 
    @Id 
    @Column(name = "id", unique = true) 
    private UUID id = UUID.randomUUID(); 

} 

public User extends BaseEntity{ 
    @OneToOne 
    private Address address; 

    //... Getter/Setter 
} 

public Address extends BaseEntity{} 

我的問題是,如果我想使用UUID作爲主鍵,我們需要使用發電機來分配的UUID是哪兩種方法之間的區別?Hibernate @GeneratedValue V.S.定製分配

對於自動生成,UUID僅在保存到數據庫後生成。以下

User user = new User(); 
    User newUser = userRepository.save(user); 
    newUser.setAddress(new Address()); 
    User newUserWithAddress = userRepository.save(user); 
    return newUserWithAddress; 

對於自定義分配,可以在將UUID保存到數據庫之前生成UUID。代碼更乾淨。 如果我使用自定義作業,是否存在任何潛在問題?

User user = new User(); 
    userRepository.save(user); 
    user.setAddress(new Address()); 
    userRepository.save(user); 
    return user; 
+0

在自動生成中,您將如何確認每個生成的ID是唯一的?而不是重複? –

回答

2

分配在構造一個隨機標識符有缺點:

  • 需要時間,大部分時間,白白:每休眠從數據庫加載一個實體,構造函數被調用時,生成一個新的UUID,然後Hibernate會將保存的實體的實際ID分配給該字段
  • Hibernate(和您自己的代碼),除非您還使用樂觀鎖定,無法知道給定實體是否分離或短暫的。而在由Hibernate生成的ID的情況下,如果ID爲空,則該實體是暫時的,否則該實體被分離。
相關問題