我有两个几乎相同的表代表同一个类。唯一的区别是第二个表有一个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个具有不同映射的相同类的情况下理想地执行我想要的操作?
答案 0 :(得分:1)
“几乎相同的表”!=“相同的表”。如果需要规范化数据库,那么可以使用继承,创建基类并使用保存差异的实体扩展它。但是,我不认为试图操纵JPA以补偿数据库问题是一个好主意。更好地修复数据库或只创建两个独立的实体。