我正在尝试映射下表
CREATE TABLE Person (
p_id varchar(255) not null,
p_name varchar(255 not null,
p_post_code varchar(12) not null,
primary key (p_id, p_name),
);
通常当我将实体映射到上面的表时,我会做这样的事情(对于单列主键):
private int p_id;
private String p_name;
private String p_post_code;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="p_id")
public Long getPId() {
return p_id;
}
public void setPId(int p_id) {
this.p_id = p_id;
}
@Column(name="p_name")
public String getPname() {
return p_name;
}
public void setPname(String string) {
this.p_name = string;
}
@Column(name="p_post_code")
public String getPostCode() {
return p_post_code;
}
public void setPostCode(String string) {
this.p_post_code = string;
}
如果主键是单个列(即p_id)并且在数据库中生成此列的值,则上述方法有效。 我如何修改上面的内容以映射它,以便p_id和p_name都是主键。
此外,如果复合键是另一个表中的外键,它将如何工作。
我正在尝试谷歌的一些例子,但我找不到一个简单的例子,大多数似乎使用基于XML的配置。
答案 0 :(得分:1)
将复合键与JPA一起使用时,您需要使用嵌入式类作为id。
在您的情况下,您将拥有一个人类和一个人的主要密钥类:
@entity
public class Person
{
@EmbeddedId
private PersonPK key;
@Column(name="p_post_code", nullable = false)
private String p_post_code;
//....
}
@Embeddable
public class PersonPK
{
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="p_id");
private Long p_id;
@Column(name="p_name")
private String p_name;
public PersonPK(String name)
{
p_name = name;
}
//....
}
使用类的名称(因此名称也是外键):
@entity
public class Person
{
@EmbeddedId
private PersonPK key;
@MapsId(value="p_name_id")
@ManyToOne
@JoinColumn(name = "p_name_id", referencedColumnName = "id")
private Name p_name;
@Column(name="p_post_code", nullable = false)
private String p_post_code;
//....
}
@Embeddable
public class PersonPK
{
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="p_id");
private Long p_id;
@Column(name="p_name_id")
private Long p_name_id;
public PersonPK(Name name)
{
p_name_id = name.getId();
}
//....
}
@Entity
public class Name
{
@Id
@GeneratedValue(some generation strategy here)
@Column(name="id")
private Long id;
@Column(name="name")
private String name;
//....
}