JPA Hibernate - 将MySQL Composite键映射到JPA(Hibernate)实体

时间:2012-03-21 13:02:50

标签: java mysql hibernate jpa

我正在尝试映射下表

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

1 个答案:

答案 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;

    //....
}