developer tip

엔티티를 읽기 전용으로 만드는 방법은 무엇입니까?

copycodes 2020. 11. 13. 23:41
반응형

엔티티를 읽기 전용으로 만드는 방법은 무엇입니까?


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

반응형