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

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

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



답변

다음은 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 문서를 읽어 보세요.


답변

이 메모도 유용하다는 것을 알았 @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;
    ...
}


답변

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


답변

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


답변

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.


답변