Lewis's Tech Keep

[JPA] 엔티티가 final이 될 수 없는 것에 대하여 본문

Java/JPA

[JPA] 엔티티가 final이 될 수 없는 것에 대하여

Lewis Seo 2023. 3. 8. 09:59

JPA를 하면서 좀 불만아닌 불만이랄까...

 

불변성 보장을 하고 싶은데 final을 쓸 수 없는 모순에 자꾸 부딪히게 된다.. (참고 링크)

 

일단 왜 final을 이용해 불변 객체로 만들고 싶은가 하면

 

특히 진행 중인 사이드 프로젝트에 web-flux 를 사용하려고 생각하고 있었는데,

web-flux는 리액티브 웹 프레임워크이며 논블로킹 리액티브 스트림을 이용하게 될 것이기 때문에 불변임을 보장하여 좀 더 안정적인 프로그램을 만들고 싶었다.

 

불변 객체 일 때 장점

- https://mangkyu.tistory.com/131

 

[Java] 불변 객체(Immutable Object) 및 final을 사용해야 하는 이유

클린코드를 읽어도, 이펙티브 자바를 읽어도, 개발을 잘하는 팀의 얘기를 들어도 항상 좋은 코드를 얘기할 때면 불변의 객체를 필연적으로 접하게 되는 것 같습니다. 그래서 이번에는 불변의 객

mangkyu.tistory.com

 


 

JPA final class 불가능한 이유

 

hibernate에서 lazy load 시 기존 엔티티를 extends 하는 것을 볼 수 있는데 final class를 선언한다면 이를 할 수 없게 된다.

- https://www.baeldung.com/hibernate-proxy-load-method

 

여기서 조금 의문인 점.. -> 그렇다면 lazy load 가 아닌 경우에는 왜 괜찮을까???

- 괜찮다고 하는 글은 꽤 있음 그렇지만 프록시 객체를 생성하는 시점에서 final이 괜찮을 수 있나? -> 조사 중

 

- https://docs.oracle.com/cd/E19798-01/821-1841/bnbqb/index.html#:~:text=The%20class%20must%20not%20be,variables%20must%20be%20declared%20final.

 

Requirements for Entity Classes (The Java EE 6 Tutorial)

Requirements for Entity Classes An entity class must follow these requirements. The class must be annotated with the javax.persistence.Entity annotation. The class must have a public or protected, no-argument constructor. The class may have other construct

docs.oracle.com

 

- https://stackoverflow.com/questions/59807025/how-to-prove-jpa-enity-must-not-be-final-class-with-hibernate-5

 

How to prove JPA Enity must not be final class with Hibernate 5

JSR 338: JavaTM Persistence API 2.1 Specification > 2.1 The Entity Class specifies: The entity class must not be final. No methods or persistent instance variables of the entity class may be fin...

stackoverflow.com

 

- https://javarevisited.blogspot.com/2016/01/why-jpa-entity-or-hibernate-persistence-should-not-be-final-in-java.html

 

Why JPA Entity or Hibernate Persistence Class Should Not be Final? Answer

A blog about Java, Programming, Algorithms, Data Structure, SQL, Linux, Database, Interview questions, and my personal experience.

javarevisited.blogspot.com

- https://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html/ch02.html

 

Chapter 2. Entity

Standard, portable JPA essentially requires this. Otherwise your model would violate the requirement quoted above in regards to accessing the entity persistent state fields directly from outside the entity itself. Although Hibernate does not require it, it

docs.jboss.org

 

 


 

JPA final field 가능한 지

 

- 가능하기는 하지만 엔티티는 변할 수 있고 이를 수정하지 않는다고 가정할 시 reflection 을 이용해 수정한다고 되어 있다.      퍼포먼스 이슈 있을 수 있음.

 

- https://stackoverflow.com/questions/2455906/persistence-provider-for-java-that-supports-final-fields

 

Persistence provider for Java that supports final fields

I'm very new to Java but I've been developing a habit to use final wherever possible declaring immutability which i think is a good thing. (Consider f#) I've read that JPA does not support final f...

stackoverflow.com

 

- https://stackoverflow.com/questions/912093/is-there-any-way-to-declare-final-fields-for-hibernate-managed-objects

 

Is there any way to declare final fields for Hibernate-managed objects?

I'm just getting started with Hibernate, and all the examples I'm seeing so far look pretty much like the tutorial in the Hibernate documentation: package org.hibernate.tutorial.domain; import jav...

stackoverflow.com

 

Comments