【问题标题】:JPA @MapsId vs @JoinColumn(updatable=false, insertable=false)JPA @MapsId vs @JoinColumn(可更新=假,可插入=假)
【发布时间】:2013-12-13 03:28:17
【问题描述】:

在我看来,以下两种映射方式几乎没有区别。这是一个基于@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;
}

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

【问题讨论】:

  • 你测试了吗?
  • 是的,但还有一些其他奇怪的问题。但是根据文档的描述,我找不到它们的任何区别。可以给点提示吗?
  • 那么什么对你更好?我曾经使用 JoinColumn,对我来说它有效。但是现在我看到了 MapsId,所以我也想知道它是如何工作的;)
  • @Rafik991 我也一样 :P 我曾经使用 JoinColumn 但我看到了 MapsId(也许它是 JPA2 的新东西?或者我过去错过了它)。这个问题的原因只是为了了解区别:P

标签: java jpa


【解决方案1】:

所以,当我在表中只有一个外键时,我测试了@MapsId 的用法,它没有什么不同。但是对于我在一张桌子上有两个外键的桌子,比如...... UserTable, 和 EmailTable-> @MapsId(owner)UserTable owner, @MapsId(receiver) UserTable receiver 我有问题。 Hibernate 抛出异常。所以我必须回到旧的@JoinColumn 这样做。这是我遇到的一个不同之处。

【讨论】:

  • 是的,事实上我也遇到了这个异常,但我怀疑它只是别的东西,因为从文档来看,MapsId 应该适用于(并且是针对)这种情况。我更想知道这两者之间的区别,通过功能设计。但是,仍然非常感谢您的更新,因为它还告诉我,我不是唯一一个有这种例外的人 ;) LOL
【解决方案2】:

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

@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 生成的表

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

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 2017-10-16
    • 2011-03-19
    • 2023-03-11
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    相关资源
    最近更新 更多