엔티티를 읽기 전용으로 만드는 방법은 무엇입니까?
JPA로 엔티티를 읽기 전용으로 만드는 적절한 방법은 무엇입니까? 내 데이터베이스 테이블이 프로그래밍 방식으로 전혀 수정되지 않기를 바랍니다.
나는 내 물건을 LockModeType.READ
. 주석을 사용하여 데이터베이스에서 검색 한 후 엔터티를 직접 잠글 수 있습니까? 아니면 특정 엔터티에 대한 일반 DAO를 엉망으로 만들고 재정의해야합니까?
해결책은 필드 기반 주석을 사용하여 필드를 선언 protected
하고 공개 getter 만 제안하는 것입니다. 이렇게하면 개체를 변경할 수 없습니다.
(이 솔루션은 엔티티에 특정한 것이 아니라 불변 객체를 빌드하는 방법 일뿐입니다)
엔티티에 다음 EntityListener
과 같이 추가 하십시오.
@Entity
@EntityListeners(PreventAnyUpdate.class)
public class YourEntity {
// ...
}
EntityListener
업데이트가 발생하면 예외를 throw하려면을 구현하십시오 .
public class PreventAnyUpdate {
@PrePersist
void onPrePersist(Object o) {
throw new RuntimeException("...");
}
@PreUpdate
void onPreUpdate(Object o) {
throw new RuntimeException("...");
}
@PreRemove
void onPreRemove(Object o) {
throw new RuntimeException("...");
}
}
그러면 JPA 라이프 사이클 리스너를 사용하여 엔티티에 대한 방탄 안전망이 생성됩니다.
- PRO : JPA 표준-최대 절전 모드가 아님
- 장점 : 매우 안전함
- CON : 런타임에 쓰기 시도 만 표시 합니다 . 당신이 원하는 경우 컴파일 시간 체크를, 당신은 세터를 구현하지 않아야합니다.
JPA 구현이 최대 절전 모드 인 경우-최대 절전 엔티티 주석을 사용할 수 있습니다.
@org.hibernate.annotations.Entity(mutable = false)
분명히 이것은 모델을 최대 절전 모드로 묶을 것입니다.
Hibernate org.hibernate.annotations.Immutable
에는 유형, 메소드 또는 필드에 넣을 수 있는 주석 도 있습니다 .
나는 당신이 찾고있는 것은 당신의 엔티티가 불변이라고 생각합니다. Hibernate는 이것을 지원합니다; JPA (최소 JPA 1.0)는 그렇지 않습니다. getter 만 제공하여이를 제어 할 수 있고 getter가 변경 불가능한 값만 반환하도록 할 수 있다고 가정합니다.
IIRC 당신에게 모든 필드를 설정할 수 있습니다 insertable = false
그리고 updatable = false
당신에 @Column
:) ... 더 나은 방법이 있어야 주석,하지만 난 확신
Eclipselink 구현 @ReadOnly
은 엔티티 레벨에서 주석 도 제공합니다.
나는 항상 그것을 제안하기 위해 반대 투표를 받기 때문에 이것은 아마도 저에게 반대 투표를 잡을 것입니다. 그러나 이것을 시행하기 위해 여러 가지 방법으로 AspectJ 를 사용할 수 있습니다 .
Mac의 솔루션을 자동화하십시오 (AspectJ가 @Column
주석을 주입하도록 함 ).
declare @field : (@Entity *) *.* : @Column(insertable=false);
또는 set 메서드에 대한 모든 액세스에 대해 컴파일러 오류를 선언합니다.
declare error : execution((@Entity *) *.set*(*) );
단점 : 빌드에 AspectJ 컴파일을 추가해야하지만 ant 또는 maven 을 사용하는 경우 쉽습니다.
If you are using spring-data or are otherwise using the Repository pattern, don't include any save / update / create / insert / etc methods in the Repository for that particular entity. This can be generalized by having a base class / interface for readonly entities, and an updatable one that extends the readonly one for updatable entities. As other posters have pointed out, the setters may also be made non-public to avoid developers accidentally setting values that they are then unable to save.
참고URL : https://stackoverflow.com/questions/5115527/how-to-make-an-entity-read-only
'developer tip' 카테고리의 다른 글
Android WebView 진행률 표시 줄 (0) | 2020.11.13 |
---|---|
Perl의 STDIN 또는 입력 파일에서 프로그래밍 방식으로 읽기 (0) | 2020.11.13 |
Android x86 화면 해상도 전환 (0) | 2020.11.13 |
자바 스크립트에서 문자열의 줄 수를 계산하는 방법 (0) | 2020.11.13 |
자바 스크립트를 사용한 세션 전용 쿠키 (0) | 2020.11.13 |