누군가가 최대 절전 모드에서 @MapsId를 설명해 주시겠습니까?


81

누군가 @MapsId가 최대 절전 모드 에서 나에게 설명해 주 시겠습니까? 나는 그것을 이해하는 데 어려움을 겪고 있습니다.

예를 들어 설명 할 수 있고 어떤 종류의 사용 사례에 가장 적합할까요?

답변:


47

다음은 Object DB 의 멋진 설명입니다 .

EmbeddedId 기본 키, EmbeddedId 기본 키 내의 특성 또는 상위 엔터티의 단순 기본 키에 대한 매핑을 제공하는 ManyToOne 또는 OneToOne 관계 특성을 지정합니다. value 요소는 관계 속성이 해당하는 복합 키 내의 속성을 지정합니다. 엔티티의 기본 키가 관계에서 참조하는 엔티티의 기본 키와 동일한 Java 유형 인 경우 값 속성이 지정되지 않습니다.

// parent entity has simple primary key

@Entity
public class Employee {
   @Id long empId;
   String name;
   ...
} 

// dependent entity uses EmbeddedId for composite key

@Embeddable
public class DependentId {
   String name;
   long empid;   // corresponds to primary key type of Employee
}

@Entity
public class Dependent {
   @EmbeddedId DependentId id;
    ...
   @MapsId("empid")  //  maps the empid attribute of embedded id
   @ManyToOne Employee emp;
}

여기 에서 API 문서를 읽어 보세요.


6
하지만 무엇이 그렇게 좋은가요? @MapsId 없이도 JoinColumn을 사용하여 동일한 효과를 얻을 수 있습니까? 만약 그렇다면,이 예제는이 주석이 정말 좋은 점을 알려주지 않습니다.
Maksim Gumerov

2
두 엔터티가 동일한 기본 키를 공유하므로 @MapsId지속성 계층 (데이터베이스)에서 will로 지정된 열이있는 엔터티 에는 기본 키 열만 있습니다. 아이디어는 두 엔티티간에 기본 키를 공유하는 것입니다.
johanwannheden

EmbeddedId 기본 키는 무엇입니까? 일반 기본 키와 어떻게 다릅니 까?
sofs1 2018-06-09

"값 요소는 관계 속성이 해당하는 복합 키 내의 속성을 지정합니다."1) 값 요소의 의미는 무엇입니까? 예를 들어주십시오. 2) 복합 키란 무엇입니까? 3) 관계 속성은 무엇이며 예제를 제공합니까?
sofs1

@MaksimGumerov의 Dependent식별자를 아는 것만으로 가져올 수 있기 때문에 효율적 입니다 Employee.
Emmanuel Osimosu

26

이 메모도 유용하다는 것을 알았 @MapsId습니다. 최대 절전 모드에서 주석은 다른 테이블의 열과 열을 매핑합니다.

두 테이블간에 동일한 기본 키를 공유하는데도 사용할 수 있습니다.

예:

@Entity
@Table(name = "TRANSACTION_CANCEL")
public class CancelledTransaction {
    @Id
    private Long id; // the value in this pk will be the same as the
                     // transaction line from transaction table to which 
                     // this cancelled transaction is related

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_TRANSACTION", nullable = false)
    @MapsId
    private Transaction transaction;
    ....
}

@Entity
@Table(name = "TRANSACTION")
@SequenceGenerator(name = "SQ_TRAN_ID", sequenceName = "SQ_TRAN_ID")
public class Transaction  {
    @Id
    @GeneratedValue(generator = "SQ_TRAN_ID", strategy = GenerationType.SEQUENCE)
    @Column(name = "ID_TRANSACTION", nullable = false)
    private Long id;
    ...
}

양방향 연결에서 @MapsId를 어디에 두나요? 두 클래스 모두 @MapsId. 차이가 있습니까?
marcus

나는 한 테이블이 원래 pk의 "소유자"( @Id@GeneratedValue및 포함 @Column) 가 있고 다른 테이블 @OneToOne@JoinColumn함께 및가 있고 다른 테이블에는 @MapsId. 그러나 먼저 '다른 테이블'에 INSERT하려면 작동하지 않을 것입니다.
Tonsic

1
사용의이 방법에 대한 좋은 글 (다른 엔티티의 ID와 다른 테이블에서 ID를 사용하여)는 여기 vladmihalcea.com/...
Lubo

하지만 취소 된 거래에서 거래를 걸러 내려면 .. 일반적인 원인입니다. 이것이 어떻게 더 효율적입니까? 내 말은 SQL의 경우 TRANSACTION.fk_cancelled_id에 대해 NOT NULL이라고 말해야하지만이 경우 더 많은 작업이 될 것입니다.
M_F

여기서이 특정 경우에는 트랜잭션이 '취소'유형인지 또는 기타 유형인지 식별 ​​할 수있는 기본 클래스 및 테이블에서 '유형'과 같은 열을 사용하는 것이 일반적입니다.
Tonsic

4

튜토리얼 에서 Vladimir를 설명했듯이 @OneToOne 관계를 매핑하는 가장 좋은 방법은 @MapsId를 사용하는 것입니다. 이렇게하면 부모 엔터티 식별자를 사용하여 항상 자식 엔터티를 가져올 수 있으므로 양방향 연결이 필요하지 않습니다.


2

MapsId를 사용하면 서로 다른 두 항목 / 테이블간에 동일한 기본 키를 사용할 수 있습니다. 참고 : MapsId를 사용하면 CASCADE.ALL플래그가 쓸모 없게되며 엔티티가 수동으로 저장되었는지 확인해야합니다.


2

IMHO, 생각하는 가장 좋은 방법 @MapsId은 an : m 엔터티에서 복합 키를 매핑해야 할 때입니다.

예를 들어 고객은 한 명 이상의 컨설턴트를 보유 할 수 있고 컨설턴트는 한 명 이상의 고객을 보유 할 수 있습니다.

여기에 이미지 설명 입력

그리고 귀하의 항목은 다음과 같습니다 (의사 Java 코드).

@Entity
public class Customer {
   @Id
   private Integer id;

   private String name;
}

@Entity
public class Consultant {
   @Id
   private Integer id;

   private String name;

   @OneToMany
   private List<CustomerByConsultant> customerByConsultants = new ArrayList<>();

   public void add(CustomerByConsultant cbc) {
      cbc.setConsultant(this);
      this.customerByConsultant.add(cbc);
   }
}

@Embeddable
public class ConsultantByConsultantPk implements Serializable {

    private Integer customerId;

    private Integer consultantId;
}

@Entity
public class ConsultantByConsultant {

   @EmbeddedId
   private ConsultantByConsultantPk id = new ConsultantByConsultantPk();

   @MapsId("customerId")
   @JoinColumn(insertable = false, updatable = false)
   Customer customer;

   @MapsId("consultantId")
   @JoinColumn(insertable = false, updatable = false)
   Consultant consultant;
}

이러한 방식으로 매핑하면 JPA 는 컨설턴트를 저장할 때마다 자동으로에 CustomerConsultantID를 삽입합니다 EmbeddableId. 따라서 수동으로 ConsultantByConsultantPk.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.