저는 Spring 프레임 워크와 함께 Hibernate 를 사용하는 경향이 있으며 선언적 트랜잭션 경계 기능 (예 : @Transactional )입니다.
우리 모두가 알고 있듯이, 최대 절전 모드는 가능한 한 비 침습적 이고 투명 하도록 노력 하지만 관계를 사용할 때 조금 더 도전적lazy-loaded
입니다.
투명도 수준이 다른 여러 디자인 대안이 있습니다.
- 지연로드되지 않는 관계 만들기 (예 :
fetchType=FetchType.EAGER)
- 이것은 지연 로딩의 전체 아이디어를 위반합니다.
- 다음을 사용하여 컬렉션 초기화
Hibernate.initialize(proxyObj);
- 이것은 DAO에 상대적으로 높은 결합을 의미합니다.
- 를 사용하여 인터페이스를 정의 할 수 있지만
initialize
다른 구현에서는 동등한 기능을 제공하지 않을 수도 있습니다.
- 영구
Model
객체 자체에 트랜잭션 동작 추가 ( 동적 프록시 또는 사용@Transactional
)- @Transactional이 영구 개체 자체에서 작업하는 것 같지는 않았지만 동적 프록시 접근 방식을 시도하지 않았습니다. 아마도 최대 절전 모드로 인해 프록시에서 작동합니다.
- 거래가 실제로 발생할 때 통제력 상실
- 모두 게으른 / 비 지연 API를 제공, 예를 들어,
loadData()
및loadDataWithDeps()
- 응용 프로그램이 어떤 루틴을 사용할지 알도록합니다.
- 메서드 오버플로
loadDataWithA()
,, ....,loadDataWithX()
- 예를 들어
byId()
오퍼레이션 만 제공하여 종속성에 대한 강제 조회- 비 객체 지향 루틴, 예를 들어, 많이 필요
findZzzById(zid)
하고getYyyIds(zid)
대신z.getY()
- 트랜잭션간에 처리 오버 헤드가 큰 경우 컬렉션의 각 개체를 하나씩 가져 오는 것이 유용 할 수 있습니다.
- 비 객체 지향 루틴, 예를 들어, 많이 필요
- DAO 대신 @Transactional 응용 프로그램의 일부를 만듭니다.
- 중첩 된 트랜잭션의 가능한 고려 사항
- 트랜잭션 관리에 적합한 루틴이 필요합니다 (예 : 충분히 작음)
- 프로그래밍 방식의 영향은 적지 만 대규모 트랜잭션이 발생할 수 있음
- DAO에 동적 가져 오기 프로필을 제공합니다 . 예 :
loadData(id, fetchProfile);
- 응용 프로그램은 언제 사용할 프로필을 알아야합니다.
- AoP 유형의 트랜잭션 (예 : 작업을 가로 채고 필요한 경우 트랜잭션 수행)
- 바이트 코드 조작 또는 프록시 사용 필요
- 거래가 수행 될 때 통제력 상실
- 언제나처럼 흑 마법 :)
내가 놓친 옵션이 있습니까?
lazy-loaded
애플리케이션 설계에서 관계 의 영향을 최소화하려고 할 때 선호하는 접근 방식은 무엇입니까?
(오, WoT 죄송합니다 )