在我看来,以下两种映射方式之间几乎没有区别。这是一个基于@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;
}
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)
以上两种方法有什么区别?
因此,我测试了 @MapsId 的用法,当表中只有一个外键时,这没有什么不同。但是对于一个表有两个外键的表,例如 ...
UserTable
和EmailTable
-> @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 时生成的表可以注意到添加了额外的字段“member_model_memberid”。
归档时间: |
|
查看次数: |
8894 次 |
最近记录: |