JPA Hibernate - сопоставление составных ключей MySQL с сущностями JPA (Hibernate) - PullRequest
1 голос
/ 21 марта 2012

Я пытаюсь сопоставить следующую таблицу

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.

1 Ответ

1 голос
/ 06 июня 2012

При использовании составных ключей с JPA вам необходимо использовать встроенный класс в качестве идентификатора.

В вашем случае у вас будет класс для человека и класс первичного ключа для человека:

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

    //....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...