기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)
JPA 스펙이 이렇게 정의되어 있습니다.
JPA를 구현해서 쓰는 라이브러리들이 동적으로 리플렉션 같은 기술을 써서 객체를 프록싱하는데 필요하기 때문입니다.
→ 자세히
final 클래스, enum, interface, inner 클래스 사용 X
저장할 필드에 final 사용 X
JPA 구현체들은 엔티티를 내부에서 다양한 방식으로 사용합니다.
예를 들어서 엔티티를 JPA 구현체가 생성할 때 리플렉션을 사용해서 객체를 먼저 생성하고, 나중에 값을 필드에 직접 넣어주기도 합니다.
이런 경우 final이면 안되겠지요?
지연로딩 등을 위해 프록시 기술을 사용하기도 합니다.
이렇게 다양한 방식으로 JPA 구현체들이 사용할 수 있도록 JPA는 스펙상 final을 사용하지 못하도록 막아두었습니다.
속성: name
사실 별로 중요하진 않습니다. 일반적으로 쓸 이유는 없고, 다른 패키지에 같은 이름의 클래스가 있고, JPA로 매핑 되어있을 경우 다른 이름을 씁니다.