복붙노트

[SPRING] 엔티티 당 두 개의 테이블을 최대 절전 모드로 전환

SPRING

엔티티 당 두 개의 테이블을 최대 절전 모드로 전환

하나의 엔티티 - 사용자가 있습니다. User.class에 의해 설명됩니다.

Hibernate는 하나의 엔티티마다 하나의 테이블을 생성하기 때문에 session.save (user)를 호출하면 데이터가 항상이 테이블에 저장됩니다.

이제 동일한 사용자 유형의 데이터에 대해 다른 테이블이 필요하며 엔티티를 해당 테이블에만 저장해야합니다.

데이터 구조 (이와 비슷한 것) :

table users_1_table{
  string id;
  string username;
}

table users_2_table{
  string id;
  string username;
}

이 작업 :

session.save(user1,"users_1_table")
session.save(user2,"users_2_table")

결과적으로 users_1_table에 user1이 있어야하고 users_2_table에 user2가 있어야합니다.

시스템 제한으로 인해이 두 객체를 하나의 테이블에 넣을 수 없습니다. (심지어 여분의 필드를 만드는 것은 나쁜 생각입니다).

하위 클래스를 지정하지 않고도이 작업을 수행 할 수 있습니까? 프로그래밍 방식으로 최대 절전 모드 구성 사용?

해결법

  1. ==============================

    1.머리말:

    머리말:

    이것은 SO에서도 널리 질문되는 질문이며, 그 답변은 Subclass 또는 실제로 SuperClass와 관련이 있습니다 (예 : [1]).

    실제 답변 :

    이 게시물들 [2], [3]에서는 EntityName 매개 변수와 함께 xml 매핑을 사용하는 것이 좋습니다.

    따라서 xml을 사용하여 매핑 할 때는 supeclass가 필요하지 않습니다. 두 개의 동일한 매핑에 EntityName 매개 변수를 지정하면됩니다.

    예제 매핑 :

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
       <class name="DomainModel.User, DomainModel"
         table="User1Object" entity-name="User1Object">  
             <id name="_id" access="field" column="id">
                 <generator class="assigned"/>
             </id>
            <property name= ...>
     </class>
     <class name="DomainModel.User, DomainModel"
         table="User2Object" entity-name="User2Object">
             <id name="_id" access="field" column="id">
                <generator class="assigned"/>
             </id>
            <property name= ...>
    </class>
    </hibernate-mapping>
    

    그런 다음 필요한 엔티티 유형에 따라 적절한 세션 메소드를 다음과 같이 호출하십시오.

    _session.Save ( "User1Object", user1)

    또는

    _session.Save ( "User2Object", user2)

    이 스 니펫의 기초로 2 및 3 게시물이 사용되었습니다. 공식 출처 [4]

    경기 후 :

    실제로이 게시물 [5]에 링크 된 첫 번째 질문에 대한 한 가지 대답은 다른 접근 방법입니다.

    먼저 개체의 첫 번째 인스턴스를 작성하고 데이터를 새로운 인스턴스로 복제 한 다음 다른 이름으로 저장합니다. 따라서, Hibernate 로직과 모든 사람의 컨텐츠에 대한 위반은 없다 : 두개의 테이블에서 동일한 데이터가 사용되며 서브 클래스가 사용되지 않는다.

    음, 그 방법의 구현이나 코드 또는 신뢰성은 너무나 그렇습니다. 나는 테스트하지 않았습니다.

    다른 경우 :

    이 포스트 [6]에는 더 간단한 방법으로 수퍼 클래스 접근법에 도전하려고하는 또 다른 사람이 있지만, 가장 신뢰할만한 대답은 다른 방법으로는 가능하지 않다는 공식적인 비 xml 접근법은 상기 서브 클래스 접근법입니다.

  2. ==============================

    2.또한 기본 엔티티와 다른 엔티티를 사용하여 작동합니다.

    또한 기본 엔티티와 다른 엔티티를 사용하여 작동합니다.

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
       <class name="DomainModel.User, DomainModel"
         table="User1Object">  
             <id name="_id" access="field" column="id">
                 <generator class="assigned"/>
             </id>
            <property name= ...>
     </class>
     <class name="DomainModel.User, DomainModel"
         table="User2Object" entity-name="User2Object">
             <id name="_id" access="field" column="id">
                <generator class="assigned"/>
             </id>
            <property name= ...>
    </class>
    </hibernate-mapping>
    

    디폴트의 ​​경우,이 메소드를 사용할 수 있습니다.

    _session.Save(user1)
    

    _session.Save("User2Object", user2)
    

    대안으로.

  3. ==============================

    3.구성을 사용하여 수행 할 수 있습니다.

    구성을 사용하여 수행 할 수 있습니다.

    이것은 무엇을 성취합니까?

    비용은 얼마입니까?

    하위 유형에 대한 이점이 있습니까?

    당신이 그것을해야합니까?

  4. ==============================

    4.비록 내가 사용한 적이 있지만 절전 모드에서 보조 테이블 개념이 있습니다. 그리고 @SecondaryTables는 엔티티가 하나 이상의 테이블을 매핑하여 데이터를 가져올 수있는 최대 절전 모드의 주석입니다. 데이터를 가져 오는 엔티티에는 @SecondaryTables 주석이 있어야합니다. 기본 및 외래 키를 기반으로하고 고유 한 제약 조건에 따라 보조 테이블을 연결합니다.

    비록 내가 사용한 적이 있지만 절전 모드에서 보조 테이블 개념이 있습니다. 그리고 @SecondaryTables는 엔티티가 하나 이상의 테이블을 매핑하여 데이터를 가져올 수있는 최대 절전 모드의 주석입니다. 데이터를 가져 오는 엔티티에는 @SecondaryTables 주석이 있어야합니다. 기본 및 외래 키를 기반으로하고 고유 한 제약 조건에 따라 보조 테이블을 연결합니다.

    다음은 Google을 수행 한 후 발견 한 샘플입니다. 달성에 도움이되는지 확인하십시오.

    http://www.concretepage.com/hibernate/secondarytables_hibernate_annotation.php

  5. from https://stackoverflow.com/questions/16755260/hibernate-two-tables-per-one-entity by cc-by-sa and MIT license