简体   繁体   English

Hibernate @GeneratedValue VS自定义分配

[英]Hibernate @GeneratedValue V.S. custom assignment

// 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{}

My question is if I want to use UUID as primary key, do we need to use the generator to assign the UUID and what is the difference between two method ? 我的问题是,如果我想使用UUID作为主键, 是否需要使用生成器来分配UUID,这两种方法有什么区别

For the Auto generation, the UUID only generated AFTER it saved into database. 对于自动生成,UUID仅在将其保存到数据库之后生成。 The following 下列

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

For the custom assignment, the UUID can generated BEFORE it saved into database. 对于自定义分配,UUID可以在保存到数据库之前生成。 The code is cleaner. 代码更干净。 Is that any potential problems if I use custom assignment ? 如果我使用自定义分配,是否有任何潜在的问题

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

Assigning a random identifier in the constructor has disadvantages: 在构造函数中分配随机标识符具有以下缺点:

  • it takes time, most of the time, for nothing: every time Hibernate loads an entity from the database, the constructor is invoked, a new UUID is generated, then Hibernate assigns the actual ID of the saved entity to the field 这需要时间,大多数情况下,是没有花费的:每次Hibernate从数据库加载一个实体时,都会调用构造函数,生成一个新的UUID,然后Hibernate将已保存实体的实际ID分配给该字段
  • Hibernate, (and your own code), unless you also use optimistic locking, has no way to know if a given entity is detached or transient. 除非您也使用乐观锁定,否则Hibernate(和您自己的代码)无法知道给定的实体是分离的还是短暂的。 Whereas in the case of IDs generated by Hibernate, if the ID is null, the entity is transient, otherwise the entity is detached. 对于由Hibernate生成的ID,如果ID为null,则该实体是瞬态的,否则该实体是分离的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM