什么时候@GenerateValue在hibernate中执行

时间:2017-10-09 01:44:59

标签: spring hibernate spring-boot

我正在使用@EntityCrudRepository在我的MySQL数据库中创建一个条目,我想知道@GeneratedValue(strategy = GenerationType.AUTO)在什么时候执行并生成自动增量值?

    @Entity
    @Table(name = "all_contacts")
    public class Contact {

      //Ideally this would be set as foreign key to application's user schema
      private long userId;

      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      @Column( name="contactid")
      private long contactId;

      @NotNull
      private String name;

   //getters and setters

    }

//

 public interface ContactRepository extends CrudRepository<Contact, Long> { }

我问,因为我想通过其getter访问contactId的值,但我是否必须等到ContactRepository.save()被调用?

2 个答案:

答案 0 :(得分:1)

在执行SQL INSERT语句之前,我们无法知道该实体的新分配ID。

所以,是的,您需要ContactRepository.save()或任何触发SQL INSERT语句的命令才能获得该ID。但保存更好,因为它可以保证始终返回ID。

答案 1 :(得分:0)

执行SQL insert语句后,我们得到生成的值。在save()之前,我们无法知道值的结果。 GenerationType.AUTO 数字生成器为实体对象生成自动对象ID,此生成的数值用于主键字段。

public static void main(String[] args) {

    List<String> list = new ArrayList<>();
    Arrays.stream("hello how are you".split(" ")).forEach(s -> list.add(s));

    Iterator<String> it = list.iterator();

    while (it.hasNext()) {
        String s = it.next();
        if (s.startsWith("a")) {
            it.remove();
        } else {
            System.out.println(s);
        }
    }

    System.out.println(list);

    ListIterator<String> lit = list.listIterator();

    while (lit.hasNext()) {
        String s = lit.next();
        if (s.startsWith("a")) {
            lit.set("1111" + s);
        } else {
            System.out.println(s);
        }
    }

    System.out.println(list);
}