java - 实体不匹配中的共享PK

标签 java hibernate spring jpa-2.0

我正在开发一个示例 Web 应用程序,使用 JPA 2.0 实体、Hibernate 3.6.2 和 Spring 3。该示例包含一对一关系的两个表,父实体是 Client,子实体是 Address,Address 中的 PK 引用 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;}
}

在我的测试方法中,我使用它们的 setter 链接两个对象,但在保留实体并执行该行之后:

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

测试失败并出现异常

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

我读过类似的问题和问题,但几乎所有问题都来自JPA 1.0,假设在JPA2.0中共享 key 是自动分配的。我错过了什么?

最佳答案

此类映射的正确版本显示在javadoc of @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; 

    ...
}

关于java - 实体不匹配中的共享PK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5726081/

相关文章:

Java代码同步问题

java - 静态查找需要@Transactional但没有它的方法

java - 错误 : org. hibernate.exception.SQLGrammarException: 无法提取 ResultSet 并且 dateAccessed 是未知列

javascript - 如何将json文件发送到spring Controller ?

java - 这段 Java 代码是否正确?

java - 绝对uri : http://java. sun.com/jsp/jSTL/core无法解析

java - 只有最后一个值是从 jTable 中的数据库打印的

spring - Java Spring : AnnotationSessionFactoryBean, Hibernate-方言自动检测

java - 通过反射调用具有 Class<T> 类型参数的私有(private)方法

java - Postgresql 枚举在 springboot 1.5->2.0 迁移期间中断