gpt4 book ai didi

java - JPA Hibernate - 将 MySQL 复合键映射到 JPA (Hibernate) 实体

转载 作者:行者123 更新时间:2023-11-29 00:47:55 25 4
gpt4 key购买 nike

我正在尝试映射下表

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 的配置。

最佳答案

在 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;

//....
}

关于java - JPA Hibernate - 将 MySQL 复合键映射到 JPA (Hibernate) 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com