2017-04-05 1 views
0

이 질문이 여기에 있다면, 필자는 분명히 그것을 찾지 못했습니다. 그렇지 않으면 특히 도움이되었습니다.상속 전략 선택 - 최대 절전 모드

나는 내 질문을 정연하게 해결할 수없는 상속 매핑에 대한 몇 가지 자습서와 몇 가지 질문을 읽었습니다.

사용자

그리고 3 개 이상의 다른 서브 클래스 : 그 모든 연장

사용자 A, 사용자 B, UserC에게

내가 추상 클래스가 말 사용자.

모든 서브 클래스에는 고유 한 테이블이 있으며, 수퍼 클래스 User은 그렇지 않습니다.

내 다른 클래스 Website에는 ArrayList가 있거나 사용자 컬렉션이 있어야합니다.

목록은 Website의 모든 사용자를 가져와야합니다.

어떤 전략을 사용해야합니까? 나는 MappedSuperclass를 생각했지만, 나의 Website 클래스에서 List는 User 타입이므로, 여기서 무엇을해야할지 모르겠다.

도움 주셔서 감사합니다.

+0

'모든 서브 클래스는 자체 테이블을 가지고 있습니다. 반면 슈퍼 클래스 사용자는 그렇지 않습니다. '이 점에주의하십시오. 수퍼 클래스의 모든 일반 필드는 각 서브 클래스 테이블에서 중복 될 수 있으며 이는 복제뿐 아니라 불일치로 이어질 수 있습니다. 접근법을 재검토하고 수퍼 클래스 용 테이블을 가지고 더 구체적인 확장 데이터를위한 추가 테이블을 얻는 것을 고려하십시오. – Jimmy

+0

@Jimmy 제 생각은 공통 필드를 너무 많이 차지하지 않았습니다. 어쨌든 나는 기존 데이터베이스 이후 구조를 변경해야한다. 가장 좋은 해결책은 무엇입니까? 감사 ! –

답변

1

JPA를 사용하면 Java 구현은 항상 사용자의 환경 설정과 요구 사항에 따라 달라지며 때로는 선택의 문제입니다.

예, @MappedSuperclass가 수행합니다. 모든 아이를 웹 사이트와 단방향으로 연결할 수 있습니다. 그런 다음 JPA에서 SQL 저장소와 '저장소'DAO 추상화를 사용하고 있다고 가정 할 때 foreign_key 필드로 데이터베이스에 매핑되는 사용자 클래스 내에 웹 사이트 개체를 갖게됩니다 (일련의 주석이 있음).

웹 사이트 클래스 내에 사용자 모음을 저장할 필요는 없습니다. 그냥 정말로 필요하다고 생각하면 일관성을 유지하는 것이 엉망이 될 수 있습니다. 그러나 양방향 관계가 필요한 경우가 있습니다. 메모리에 객체를 저장할 때 (예를 들어 캐싱 목적으로)이 콜렉션이 필요할 것입니다. 이 경우 왜 '사용자'컬렉션이 없습니까? 전용 리포지토리를 통해 데이터를 가져 오거나 사용하지 않는 경우에도 '웹 사이트'테이블이 아닌 foreign_key가있는 'User'테이블을 사용하게됩니다.

예를 들어 스프링 데이터 JPA를 사용하면 수퍼 클래스에서 단방향 관계를 정의하고 다음 방법으로 '리포지토리'를 사용할 수 있습니다 (인터넷의 어느 위치에서나 찾을 수있는 양방향 예제이므로 제공하지 않습니다) :

@Entity 
public class SuperUser extends User { 
    ... 
} 

@Entity 
public class BasicUser extends User { 
    ... 
} 

@MappedSuperclass 
public abstract class User implements Serializable {  

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "website_uuid", nullable = false) 
    protected Website website; 

    ... 
} 

@Entity 
public class Website implements Serializable { 

    ... 
} 


@Repository 
public interface SuperUserRepository extends CrudRepository<SuperUser, Long> { 

    Iterable<SuperUser> findByWebsite(Website website); 

} 

@Repository 
public interface BasicUserRepository extends CrudRepository<BasicUser, Long> { 

    Iterable<BasicUser> findByWebsite(Website website); 

} 
+0

감사! 나는 그것을 나중에 나중에 시험 할 것이다! –

1

일반적인 "Table-per-concrete-class"상속 전략이 필요한 것 같습니다. https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#entity-inheritance-table-per-class

이전 버전의 사용자 가이드에서는 별도의 테이블이 각 추상이 아닌 클래스 각각에 매핑 될 것이라고 언급했습니다. 최신 문서에서 "비 추상적"부분은 언급되지 않았지만 여전히 유사하게 작동한다고 믿습니다.일반적으로 내부적으로 비효율적 인 쿼리를 제공은 union을 사용

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
abstract class User {...} 

@Entity 
class UserA extends User {...} 

@Entity 
class UserB extends User {...} 

@Entity 
class UserC extends User {...} 

그러나이 상속 전략을 알고 있어야합니다

은 그래서 같이 보입니다.

+0

안녕하세요, 귀하의 답변 주셔서 감사합니다,하지만 난 슈퍼 클래스에 대한 테이블을 가지고 있기 때문에 이것이 작동하지 않을 수 있습니다 생각합니다. –

+0

그게 내가 언급 한거야 : 오래된 (최대 절전 3.3) 문서에서 별도의 테이블은 각각의 구체적인 (추상적이지 않은) 클래스에 사용된다고 언급했다. 따라서 추상 수퍼 클래스의 테이블은 필요하지 않습니다. 비록 행동이 바뀌면 Dunno. –

관련 문제