Hibernate @GeneratedValue V.S.自定义分配

时间:2015-09-07 11:54:25

标签: java hibernate jpa

// 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以及两种方法之间有什么区别

对于自动生成,UUID仅在保存到数据库后生成。以下

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

对于自定义分配,UUID可以在保存到数据库之前生成。代码更清晰。 如果我使用自定义作业,是否存在任何潜在问题?

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

1 个答案:

答案 0 :(得分:2)

在构造函数中分配随机标识符有缺点:

  • 大部分时间都需要花费时间:Hibernate每次从数据库加载实体时,都会调用构造函数,生成新的UUID,然后Hibernate将保存实体的实际ID分配给字段< / LI>
  • Hibernate,(和你自己的代码),除非你也使用乐观锁定,否则无法知道给定的实体是分离的还是瞬态的。在Hibernate生成ID的情况下,如果ID为null,则实体是瞬态的,否则实体将被分离。