JPA辅助表作为只读视图 – hibernate仍尝试插入行
我有以下实体:
@Entity @Table(name = "ONE") @SecondaryTable(name = "VIEW_TWO", pkJoinColumns = @PrimaryKeyJoinColumn(name="ONE_ID")) public class CpBracket { @Id private Long id; @Column(name="progress", table="VIEW_TWO", updatable = false, insertable = false) private int progress = 0; (...) }
如您所见,此实体使用表ONE和(只读)视图VIEW_TWO 。 当我持久化实体时,hibernate正在执行insert into view:
insert into VIEW_TWO (ONE_ID) values (?)
它忽略了不可更新和不可插入的列进度 (这很好),它仍然试图插入ONE_ID列的值。 据我所知,注释@PrimaryKeyJoinColumn将所选列标记为insertable = false和updatable = false 。
如何防止hibernate将行插入到辅助表(视图)中?
据我所知,注释
@PrimaryKeyJoinColumn
所选列标记为insertable = false和@PrimaryKeyJoinColumn
= false。
我不相信这可能是这样的情况:当它是实际的表而不是视图时,我们如何将记录插入到@SecondaryTable
?
由于@SecondaryTable
或@PrimarykeyJoinColumn
都没有防止插入的方法,因此看起来您的原始解决方案不起作用并且需要替代方案。
一种选择是将VIEW_TWO映射为@Entity
,并将您的类CPBracket
链接为@OneToOne
关系,并将级联选项设置为none。
@Entity @Table(name ="VIEW_TWO") private CpBracketSummaryData(){ } @Entity @Table(name = "ONE") public class CpBracket { @OneToOne @PrimaryKeyJoinColumn private CPBracketSummaryData summaryData; public int getSomeValue(){ return summaryData.getSomeValue(); } }
第二种选择是使用非JPA兼容的,Hibernate特定的@Formula
注释。
@Entity @Table(name = "ONE") public class CpBracket { @Formula("native sql query") private int someValue; }
2016年10月更新
我在Hibernate 4.3.10.Final和5.1.0.Final中重新考虑了这一点,并且可以将视图作为@SecondaryTable
而不使用insert: 如果你有正确的映射 。
情景1
加载实体以进行编辑,不要触摸映射到辅助表的任何字段。 不会向辅助表发布更新
场景2
创建并保存新实体,不要设置映射到辅助表的任何字段。 没有为辅助表发出插入
场景3
创建或更新实体,包括映射到辅助表的字段,以及此字段标记为insertable = false和updateable = false的位置。 仅针对ID字段对辅助表进行插入 – 原始问题中报告的行为。
原始问题中映射的问题在于辅助表字段是基本类型,因此在保存新实体时,Hibernate确实认为必须将记录写入辅助表,其值为零。
@Column(name="progress", table="VIEW_TWO", updatable = false, insertable = false) private int progress = 0;
然后解决方案是用相应的包装器类型替换原语并将它们保留为null。 然后,当保存新记录时,没有任何内容可写入辅助表,也不会进行插入:
@Column(name="progress", table="VIEW_TWO") private Integer progress;
- Java Hibernate json无限递归与自引用类
- 使用Oracle 10g中的Hibernate将数据保存到Clob中
- 在playframework的子模块中添加jpa / hibernate @Entity到实体管理器进行扫描
- Hibernate的每子类表inheritance策略的效率
- 如何调试“找到同一个集合的两个表示”?
- Hibernate – 自定义插入数据库
- Hibernate使用嵌入的ElementCollection抛出ConcurrentModificationException
- Hibernate实体存储为HttpSession属性值
- 查找与所选点的特定距离内的所有地址的最佳方法是什么