이것이 대부분의 답변이 "왜 그 일을하고 있습니까?"라고 질문 할 것이지만 나는 물을 것이라고 생각했습니다.테이블에 가상 행이 최대 절전 모드 일 때
대다수의 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
으로 처리 할 수있는 방법이 있습니까?
나는이 작업을 수행하는 몇 가지 방법이 고려했습니다
- 아무것도 발견하지 않은
User
의 부하에 특별한 "널 객체"를 반환하는LoadEventListener
(그리고PreInsert/PreUpdateEventListener
를 추가 거부 저장). ShoppingCart
에 descriminator 열을 추가하고User
이 매핑 된 하위 클래스가 있고 하나의 테이블 상속을 사용하여 매핑하지 않는 하위 클래스가 있습니다.ManyToMany
컬렉션이User
인지도를 만듭니다. 존재하지 않는 경우 빈 컬렉션이고, 다른 케이스에 하나의 ID가있는 컬렉션 -이 테이블은 조인 테이블없이 작동합니까?
이들 또는 다른 아이디어에 대한 의견이 있으십니까?