누군가 @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
지속성 계층 (데이터베이스)에서 will로 지정된 열이있는 엔터티 에는 기본 키 열만 있습니다. 아이디어는 두 엔티티간에 기본 키를 공유하는 것입니다.
Dependent
식별자를 아는 것만으로 가져올 수 있기 때문에 효율적 입니다 Employee
.
이 메모도 유용하다는 것을 알았 @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
. 차이가 있습니까?
@Id
및 @GeneratedValue
및 포함 @Column
) 가 있고 다른 테이블 @OneToOne
과 @JoinColumn
함께 및가 있고 다른 테이블에는 @MapsId
. 그러나 먼저 '다른 테이블'에 INSERT하려면 작동하지 않을 것입니다.
튜토리얼 에서 Vladimir를 설명했듯이 @OneToOne 관계를 매핑하는 가장 좋은 방법은 @MapsId를 사용하는 것입니다. 이렇게하면 부모 엔터티 식별자를 사용하여 항상 자식 엔터티를 가져올 수 있으므로 양방향 연결이 필요하지 않습니다.
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 는 컨설턴트를 저장할 때마다 자동으로에 Customer
및 Consultant
ID를 삽입합니다 EmbeddableId
. 따라서 수동으로 ConsultantByConsultantPk
.