2010-05-17 5 views
2

이것이 대부분의 답변이 "왜 그 일을하고 있습니까?"라고 질문 할 것이지만 나는 물을 것이라고 생각했습니다.테이블에 가상 행이 최대 절전 모드 일 때

대다수의 ID가 (사용자 정보가 제공되지 않은 세션에 대해 지연 생성 된 사용자이므로) 대다수의 (사용자) 테이블을 보유하고 있으며 나머지는 사용하지 마십시오. 데이터베이스의 열 데이터베이스의 공간을 절약하기 위해 이러한 행을 제거하기로 결정했습니다. 테이블에 외래 키가있는 많은 테이블이 있지만이 가짜 사용자를 참조 할 수있는 것은 2-3 개뿐입니다.

많은 테이블에 대해 사용자 객체가 아닌 userid을 매핑하기 위해 매핑을 전환했지만 일부 객체는 테이블에 전체 사용자 객체를 갖고 싶습니다. 그렇지 않으면 null을 반환합니다.

CREATE TABLE users AS (userid bigint); 
CREATE TABLE shopping_carts AS (cartid bigint, userid bigint); 

최대 절전 모드에서 매핑하는 방법을 볼 수 없습니다.

@Entity 
class User { 
    @Id 
    long id; 
} 

@Entity 
class ShoppingCart { 
@Id 
long id; 
@Column("userid") 
long userid; // Might not correspond to a user. 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn("userid", insertable = false, updateable = false, nullable = true) 
User user; 
} 

지금,이 널 (null)을 반환하지만 존재하지 않는 사용자에게 USER_ID 포인트 경우 ObjectNotFoundException를 throw하지 않습니다. @Fetch(FetchMode.JOIN)을 추가하는 경우에도 마찬가지입니다. 거기에 null으로 처리 할 수있는 방법이 있습니까?

나는이 작업을 수행하는 몇 가지 방법이 고려했습니다

  1. 아무것도 발견하지 않은 User의 부하에 특별한 "널 객체"를 반환하는 LoadEventListener (그리고 PreInsert/PreUpdateEventListener를 추가 거부 저장).
  2. ShoppingCart에 descriminator 열을 추가하고 User이 매핑 된 하위 클래스가 있고 하나의 테이블 상속을 사용하여 매핑하지 않는 하위 클래스가 있습니다.
  3. ManyToMany 컬렉션이 User 인지도를 만듭니다. 존재하지 않는 경우 빈 컬렉션이고, 다른 케이스에 하나의 ID가있는 컬렉션 -이 테이블은 조인 테이블없이 작동합니까?

이들 또는 다른 아이디어에 대한 의견이 있으십니까?

답변

1

, 당신을 무시하도록

@ManyToOne 
@NotFound(action=NotFoundAction.IGNORE) 

을 수행 할 수 있습니다 누락 된 기록.

1

이 주석에 보이지만, XML에 "-찾을 수 없습니다"매개 변수가 얼마나 확실하지 : 최대 절전 모드 주석 참조에서

<many-to-one name="user" class="com.example.User" column="userid" not-found="ignore" />