GeneratedValue는 jakarta에 정의되어있고, Id에 새로운 값을 자동으로 생성해줄 전략을 지정하기 위한 어노테이션이다.
실제로 @GeneratedValue
가 등록되는 것은
org.hibernate.cfg.AnnotationBinder
의bindClass
라는 public method에서 호출하는processIdPropertiesIfNotAlready
라는 private method에서 호출하는processElementAnnotations
에서 호출하는processId
에서 호출하는BinderHelper.makeIdGenerator
이다.
그 외에도 bindClass
에서는 Entity를 등록하고 여러 어노테이션을 적용하기 위한 아주 많은 동작들이 이뤄진다.. 코드량이 워낙 방대해서 전부 보긴 힘들지만 한번 보면 괜찮을 것 같은 부분만 추려보았다.
우리의 목적인 GeneratedValue
가 어디서 어떻게 나오는지에 대해 유의하며 코드를 읽어보자. (javadoc 링크)
위에서 SimpleValue id
에 set했던 부분은 field로 저장된다. id가 값 세팅받는 부분들을 보면, 중요한 정보를 많이 담고있다는 것을 알 수 있다.
Table table = id.getTable(); table.setIdentifierValue( id );
id.setIdentifierGeneratorStrategy( generatorType );
id.setIdentifierGeneratorStrategy( identifierGeneratorStrategy );
id.setIdentifierGeneratorProperties( params );
이렇게 생성된 SimpleValue는 SessionFactoryImpl
의 생성자에서 가져오고, IdentifierGenerator
의 identifierGeneratorProperties
에 SimpleValue param들이 넣어져서 identifierGenerators
로 등록된다. 이렇게 생성된 SessionFactory는 애플리케이션 전체에서 Session을 만들때 사용되므로, 전체에 적용된다 생각할 수 있다.
이렇게 저장된 identifierGenerators
는 엔티티에서 사용될 기본 정보인 EntityMetamodel
에 IdentifierProperty
(ID에 대한 설정 정보 클래스) 형태로 담긴다.
원래 String으로 저장되어있던 설정 정보가 createIdentifierGenerator
에서 클래스 참조로 바뀐다. IdentifierGenerator
를 상속받아서 구현한 경우, 저 안에서 스캔되어서 들어간다고 생각하면 된다.
`IdentifierGenerator` 코드 보기
그 entity metadata는 EntityPersister
라는 곳에 담겨서 StatelessSession
에서 insert
가 호출될때, 같이 generate된다.