簡體   English   中英

JPA Hibernate-將MySQL復合鍵映射到JPA(Hibernate)實體

[英]JPA Hibernate - Mapping MySQL Composite keys to JPA (Hibernate) entities

我正在嘗試映射下表

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為主鍵。

另外,如果組合鍵是另一個表中的外鍵,這將如何工作。

我正在嘗試用Google搜索一些示例,但是我找不到一個簡單的示例,而且大多數似乎都在使用基於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;

    //....
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM