Java JPA可插入且可更新,带有视图和SecondaryTable
Thera是oracle视图供应商视图和表供应商(为简单起见,供应商表仅包含名称id为的PK) 共同响应实体Java JPA可插入且可更新,带有视图和SecondaryTable,java,hibernate,jpa,Java,Hibernate,Jpa,Thera是oracle视图供应商视图和表供应商(为简单起见,供应商表仅包含名称id为的PK) 共同响应实体 @Entity @Table(name = "vendors") @SecondaryTable(name = "vendor_view", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "vid", referencedColumnName = "id")}) public class Vendor { @Id priva
@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为标记为insertable=false、Updateable=false的字段生成insert查询?因为hibernate不知道您尝试插入的表是表还是视图,除非它与数据库交互。所以,只有当Java程序与数据库交互时,才能检查运行时异常
这类似于,即使表不存在,它也会进行查询,但在运行时它会抛出异常 因为hibernate不知道您试图插入的表是表还是视图,除非它与数据库交互。所以,只有当Java程序与数据库交互时,才能检查运行时异常
这类似于,即使表不存在,它也会进行查询,但在运行时它会抛出异常 如果相关实体的创建/分配职责不在当前实体中,您可以这样做。例如,您有一个
人
和一个地址
。您希望将insertable=false
,updateable=false
添加到@OneToMany关系中
与地址
实体中的人员
实体,因为创建或更新人员不是地址实体的责任。相反。这实际上不是一个技术性的决定,而是一个语义/自然的决定。如果相关实体不在当前实体中,您可以这样做。例如,您有一个人
和一个地址
。您希望将insertable=false
,updateable=false
添加到@OneToMany关系中
与地址
实体中的人员
实体,因为创建或更新人员不是地址实体的责任。相反。这不是一个真正的技术决定,而是一个语义/自然决定。是的,我知道,但它与我的问题无关。因为我用insertable=false、Updateable=false标记了相应的字段。是的,我知道,但它与我的问题无关。因为我用insertable=false标记了相应的字段,updateable=false在这里查看我的答案。除非显式设置映射到@SecondaryTable
(如果它是视图,则不应设置该字段),否则不会执行insert update语句。如果您是,则即使所有其他字段都映射为不可插入/可更新字段,也会为ID列生成insert语句。请参见此处的答案。除非显式设置映射到@SecondaryTable
(如果它是视图,则不应设置该字段),否则不会执行insert update语句。如果您是,则即使所有其他字段映射为不可插入/可更新字段,也会为ID列生成insert语句。
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)