2013-03-27 2 views
1

감사 용도로 사용자 테이블과 ManyToOne 관계가있는 영구 클래스가 있습니다. 사실, 모든 수업에는 User 클래스까지이 필드가 있습니다. 최대 절전 모드 ManyToOne/N + 1 호

public class MyClass implements Serializable { 

@Fetch(value=FetchMode.SELECT) 
@ManyToOne(optional=false, fetch=FetchType.LAZY) 
@NotFound(action = NotFoundAction.IGNORE) 
@JoinColumn(name = "CREATE_USER_ID") 
public User getCreatedBy() { 
    return createdBy; 
} 

@Fetch(value=FetchMode.SELECT) 
@ManyToOne(optional=false) 
@NotFound(action=NotFoundAction.IGNORE) 
@JoinColumn(name="USER_ID") 
public User getLastUpdatedBy() { 
    return lastUpdatedBy; 
} 
} 

그냥이 더 나은 만들기 위해, 일부 적갈색이 테이블에 대부분의 감사 필드를 만든 (8)하지만 T_USER의 필드 숯불 VARCHAR2 (8), 의미있는 외래 키는 할 수 없습니다 그 (것)들에 창조 될 것이다.

Anyhoo, MyClass에 대한 쿼리는 쿼리를 시작하여 감사 필드를 채우고 쿼리를 시작하여 사용자의 감사 필드를 채 웁니다.

감사 필드가 거의 필요하지 않으므로 게으르 게 만들고 싶습니다. 불행히도, 나는 내가 여기에 반대하여 일하고 있다고 생각한다. 적어도 저조한 스키마가 그 중 하나이다.

누구든지 나를 도와 줄 수 있습니까?

제이슨

답변

2

그것은 @Fetch (값 = FetchMode.SELECT) 주석과 @ManyToOne 것 같아 (옵션 = 거짓, = FetchType.LAZY 가져 오기), 서로 싸우는 것입니다 당신이 제거 시도가 각 엔티티에 @Fetch (value = FetchMode.SELECT)를 추가하고 fetch = FetchType.LAZY를 두 연관에 모두 추가 하시겠습니까?

또 다른 이유는 @NotFound 주석은 optional = false 주석 매개 변수와의 싸움 일 수 있습니다. 하나는 다른 사람이 말할 수없는 곳에 NULL이있을 수 있다고 말합니다. * toOne 연관에 null 값을 가질 수있는 경우 연관이 NULL이 될 수 없다면 지연로드를 가질 수 없다고 생각합니다.

+0

행운을 가지고 시도해보십시오. 나는 Foreign Keys의 부족이 ManyToOne 관계를 게을리하는 능력을 해치려한다는 가정을하고있었습니다. – Jason

+0

좋아, 나는 내 대답을 다른 제안으로 업데이트했다. –

+1

당신의 대답을 받아 들였습니다. 추가 연구에서 NotFound가 추가 쿼리를 시작한 것처럼 보입니다. ManyToOne이 null 일 수있는 두 가지 장점을 모두 갖고 싶지만 NotFound가 추가 쿼리를 시작하지는 않습니다. – Jason