web-dev-qa-db-ja.com

誰かが休止状態で@MapsIdを説明してもらえますか?

誰かが私に@MapsIdを休止状態で説明してもらえますか?私はそれを理解するのに苦労しています。

例で説明できれば、どんな用途に最も適しているのでしょうか?

57
brainydexter

Object DB からのいい説明です。

EmbeddedId主キー、EmbeddedId主キー内の属性、または親エンティティの単純な主キーのマッピングを提供するManyToOneまたはOneToOne関係属性を指定します。 value要素は、関係属性が対応する複合キー内の属性を指定します。エンティティの主キーが、関係によって参照されるエンティティの主キーと同じJavaタイプである場合、value属性は指定されません。

// 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 Docs こちらをご覧ください。

35
ManuPK

このメモも便利だと思いました:@MapsId hibernate注釈では、列を別のテーブルの列にマップします。

また、2つのテーブル間で同じ主キーを共有するためにも使用できます。

例:

@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;
    ...
}
13
Tonsic