JPA @MapsId vs @JoinColumn(updatable = false,insertable = false)

时间:2013-12-13 03:28:17

标签: java jpa

在我看来,下面两种映射方式几乎没有区别。以下是基于@MapsId javadoc的示例:

// 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;
}

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

,该怎么办?
@Entity
public class Dependent {
   @EmbeddedId DependentId id;

   @ManyToOne
   @JoinColumn("empid", insertable=false, updatable=false)
   Employee emp;
}

上述两种方法的区别是什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我正在使用@MapsId和@JoinColumn的组合,以避免在DB中创建用于关联实体的额外字段。如果我忽略@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;
.
.
.
}

使用@JoinColumn生成的表

Tables generated with @JoinColumn

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

Table generated when @JoinColumn is commented