JPA @MapsId vs @JoinColumn(可更新=假,可插入=假)

Adr*_*hum 8 java jpa

在我看来,以下两种映射方式之间几乎没有区别。这是一个基于@MapsIdjavadoc的示例:

// parent entity has simple primary key

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

// 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我将 Dependent 的映射更改为:

@Entity
public class Dependent {
   @EmbeddedId DependentId id;

   @ManyToOne
   @JoinColumn("empid", insertable=false, updatable=false)
   Employee emp;
}
Run Code Online (Sandbox Code Playgroud)

以上两种方法有什么区别?

RMa*_*nik 7

因此,我测试了 @MapsId 的用法,当表中只有一个外键时,这没有什么不同。但是对于一个表有两个外键的表,例如 ... UserTableEmailTable-> @MapsId(owner)UserTable owner@MapsId(receiver) UserTable receiver我遇到了问题。Hibernate 抛出异常。所以我必须回到旧的@JoinColumn 这样做的方式。这是我在使用这些注释时遇到的一个差异。


小智 5

我将 @MapsId 和 @JoinColumn 结合使用,以避免在数据库中创建额外的字段来关联实体。如果我忽略@JoinColumn,则会在数据库中创建一个额外的字段。

@Entity
public class BookingsModel implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private SlotDateModel slotDateModelObj;

    @JsonProperty
    String slotnumber;

    @MapsId("memberid")
    @JsonBackReference
    @ManyToOne
    @JoinColumn(name="memberid",referencedColumnName = "memberid")
    @NotNull
    MemberModel memberModel;
.
.
.
}

@Entity
public class MemberModel implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @JsonProperty
    @Id
    String memberid;

    @JsonProperty
    String name;

    @JsonIgnore
    String phoneno;

    @JsonManagedReference
    @OneToMany
    Set<BookingsModel> bookings;
    .
    .
    .
    }

@Embeddable
public class SlotDateModel implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    String memberid;

    String slotdate;
.
.
.
}
Run Code Online (Sandbox Code Playgroud)

使用@JoinColumn生成的表

使用@JoinColumn生成的表

注释 @JoinColumn 时生成的表可以注意到添加了额外的字段“member_model_memberid”。

注释@JoinColumn时生成的表