【发布时间】:2016-03-16 10:57:10
【问题描述】:
Thera 是 oracle 视图 vendor_view 和表 vendors(为简单起见,vendors 表仅包含名称为 id 的 PK )
create view vendor_view as
select id as vid, 'YES' as active
from vendors;
对应实体
@Entity
@Table(name = "vendors")
@SecondaryTable(name = "vendor_view", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "vid", referencedColumnName = "id")})
public class Vendor {
@Id
private Long id;
@Column(table = "vendor_view", name = "vid", insertable = false, updatable = false)
private Long vid;
@Column(table = "vendor_view", name = "active", insertable = false, updatable = false)
private String active;
getter and setter....
}
当我尝试保留新的供应商实体时,会遇到问题:
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into vendor_view (vid) values (?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:238)
.....
Caused by: org.hsqldb.HsqlException: INSERT, UPDATE, DELETE or TRUNCATE not permitted for table or view
at org.hsqldb.error.Error.error(Unknown Source)
JPA 实现是 Hibirnate。
问题是为什么 Hibirnate 为标记为 insertable = false, updatable = false 的字段生成 insert 查询? p>
【问题讨论】:
-
在这里查看我的答案stackoverflow.com/a/37160701/1356423。除非您明确设置映射到
@SecondaryTable的字段之一(如果它是视图,则不应如此),否则不会执行插入更新语句。如果您是,那么即使所有其他字段都映射为不可插入/可更新,也会为 ID 列创建插入语句。