문제

저는 JPA(Hibernate 구현), Spring 및 Stripes 웹 앱을 개발 중입니다.감사 및 쿼리 목적으로 다음과 같은 공통 필드를 갖는 JPA 엔터티가 많이 있습니다.

CreatedBy - 엔터티를 생성한 사람의 사용자 ID입니다.Createon- 엔티티가 생성 된 날짜 업데이트 - 엔티티 업데이트를 마지막으로 업데이트 한 사람의 사용자 ID- 엔터티가 마지막으로 업데이트 된 날짜

엔터티가 유지될 때 CreateOn 및updateOn이 자동으로 설정되도록 앱이 작동하고 있지만 현재 로그인된 사용자 ID를 끝까지 통과하지 않고도 CreateBy 및updateBy 필드를 채울 수 있는 방법을 잘 모르겠습니다. 컨트롤러 클래스에서 DAO까지.

여기저기에 userID를 전달하지 않고 이 작업을 수행할 수 있는 방법에 대한 제안이 있는 사람이 있습니까?현재 사용자 ID는 현재 HttpSession 객체에 저장되어 있으므로 백엔드가 어떻게든 이 데이터에 액세스해야 합니다.

감사해요!

도움이 되었습니까?

해결책 2

나는 ThreadLocal이 아마도 내 응용 프로그램에서 이것을하는 가장 깨끗한 방법이라고 결정했습니다.

다른 팁

비즈니스 계층에서 사용자 ID를 컨텍스트로 전달하는 다음 접근 방식 중 하나를 살펴볼 수 있습니다.

(EJB를 사용하지 않더라도 게시물은 여전히 ​​관련성이 있을 수 있습니다.두 번째 게시물은 JTA와 함께 Spring을 사용하는 경우에만 의미가 있습니다)

저는 개인적으로 이러한 접근 방식을 권장하지 않습니다. 그 이유는 여기에 두 가지 문제가 있다고 생각하기 때문입니다.

  • 테스트 가능성:테스트에서 상황별 데이터를 설정해야 합니다.
  • 계약:상황별 데이터는 엔터티를 사용하기 위해 계약에 참여하지만 인터페이스에는 명확하게 표시되지 않습니다.

userID를 "모든 곳에서" 전달하는 것은 큰 일처럼 보일 수 있지만 더 깔끔하다고 생각합니다.

엔터티가 생성되거나 업데이트될 때 날짜와 사용자 ID를 자동으로 설정하려면 다음을 사용할 수 있습니다. EntityListener 또는 수명 주기 콜백 (어쩌면 이미 그렇게 하고 있을 수도 있습니다).도움이 되길 바랍니다...

다음과 같은 수업을 만들었습니다.


@MappedSuperclass
public abstract class AuditableDomainClass {
  private long createdBy;
  private long updatedBy;

  //getters and setters

설명한 요구 사항이있는 엔티티 클래스는 단순히이 클래스를 확장하고 필요한 계층에서 변수를 설정하고 (예를 들어 컨트롤러). 도오스.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top