在我看来,下面两种映射方式几乎没有区别。以下是基于@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;
}
上述两种方法的区别是什么?
答案 0 :(得分:1)
所以,我在表中测试了@MapsId的用法,我只有一个foregin键,没有什么不同。但对于我有一个表的两个外键的表格,如...
UserTable
和EmailTable
- > @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生成的表
注释@JoinColumn时生成的表。可以注意到正在添加额外的字段“ member_model_memberid”。