如何将具有不同PK的2个不同表映射到同一个类?

时间:2016-04-08 14:50:01

标签: hibernate jpa spring-data-jpa

我有两个几乎相同的表代表同一个类。唯一的区别是第二个表有一个2列主键而不是1列。 id vs id和版本 第一个表表示对象的当前状态,而第二个表包含通过触发器维护的完整历史记录(也许是我认为触发器正常的唯一时间)。 我使用Spring Boot w / Spring Data JPA和hibernate作为ORM。我希望能够通过id和id和版本查询来查询历史表以查找对象的完整历史记录。 我希望(徒劳)我可以做这样的事情:

@Entity
@Table(name = "page")
public Class Page {
    @Id
    @Column(name = "id")
    private Integer id;
    @Column(name = "version")
    private Integer version;
    //...
}

public interface PageRepository extends JpaRepository<Page, Integer> {
    // Some current page specific methods...

    @Query(value = "select * from page_history where id = :pageId order by version asc", nativeQuery = true)
    List<Page> findHistory(@Param("pageId") Integer pageId);

    //...
}

不幸的是,当我调用findHistory Hibernate时,它将id列识别为主键,因此当ResultSet中有多个具有相同id的记录时,它使用第一级会话缓存并多次返回相同的对象。

有没有办法在不创建2个具有不同映射的相同类的情况下理想地执行我想要的操作?

1 个答案:

答案 0 :(得分:1)

“几乎相同的表”!=“相同的表”。如果需要规范化数据库,那么可以使用继承,创建基类并使用保存差异的实体扩展它。但是,我不认为试图操纵JPA以补偿数据库问题是一个好主意。更好地修复数据库或只创建两个独立的实体。