Совместное использование PK в несоответствии сущностей - PullRequest
1 голос
/ 20 апреля 2011

Я разрабатываю пример веб-приложения с использованием сущностей JPA 2.0, Hibernate 3.6.2 и Spring 3. Пример содержит две таблицы в отношении «один к одному», родительская сущность - «Клиент», а дочерний - «Адрес». , PK в Address ссылается на таблицу Client (идентифицирующую связь).

Выполняя тесты JUnit, я заметил специфическую проблему с этими двумя сущностями, проблема в том, что дочерняя сущность сохраняется с (parentId + 1), мои отображения таковы:

@Entity
public class Client implements Serializable{
    private Long clientId;
    private Address address;
    //Other fields

    @Id
    @GeneratedValue
    public Long getClientId(){return this.clientId;}
    public void setClientId(Long id){this.clientId=id;}

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="clientid",referencedColumnName="fk_clientid")
    public Address getAddress(){return this.address;}
}

И дочерняя сущность:

@Entity
public class Address implements Serializable{
    private Long fkClientId;
    private Client client;
    //Other fields

    @Id
    @GeneratedValue
    public Long getFkClientId(){return this.fkClientId;}
    public void setFkClientId(Long id){this.fkClientId=id;}

    @OneToOne(mappedBy="address")        
    public Client getClient(){return this.client;}
}

В моих тестовых методах я связываю оба объекта, используя их установщики, но после сохранения сущностей и выполняю строку:

assertEquals(client.getClientId, client.getAddress().getFkClientId);

Тест не пройден за исключением

java.lang.AssertionError: expected:<654> but was:<655>

Я читал похожие вопросы и проблемы, но почти все они из JPA 1.0, предполагается, что в JPA2.0 общие ключи назначаются автоматически. Чего мне не хватает?

1 Ответ

1 голос
/ 20 апреля 2011

Правильная версия такого отображения показана в javadoc @OneToOne. Обратите внимание, что сторона с производной идентичностью должна быть стороной-владельцем (без mappedBy):

@Entity
public class Client implements Serializable {     
    @Id
    @GeneratedValue
    private Long clientId;     

    @OneToOne(mappedBy = "client", cascade = CascadeType.ALL)
    private Address address; 

    ...
}

@Entity 
public class Address implements Serializable {
    @Id
    private Long fkClientId;

    @OneToOne
    @MapsId
    @JoinColumn(name = "fk_clientid")
    private Client client; 

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