Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA可插入且可更新,带有视图和SecondaryTable_Java_Hibernate_Jpa - Fatal编程技术网

Java JPA可插入且可更新,带有视图和SecondaryTable

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

Thera是oracle视图供应商视图和表供应商(为简单起见,供应商表仅包含名称id为的PK)

共同响应实体

@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)