【问题标题】:JPA insertable and updatable with View and SecondaryTableJPA 可通过 View 和 SecondaryTable 插入和更新
【发布时间】: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 列创建插入语句。

标签: java hibernate jpa


【解决方案1】:

由于休眠不知道您尝试插入的表是表还是视图,除非它与数据库交互。所以它是运行时异常,只有在Java程序与数据库交互时才能检查。

类似于即使表不存在也会进行查询,但在运行时会抛出异常。

【讨论】:

    【解决方案2】:

    creating/udpating 相关实体的责任不在当前实体中时,您会这样做。例如。你有一个Person 和一个Address。您想将insertable=falseupdatable=false 添加到@OneToMany relationshipPerson 实体中的Address 实体,仅仅是因为创建或更新人员不是地址实体的责任。反之亦然。这并不是一个真正的技术决定,而是一个语义/自然决定。

    【讨论】:

    • 是的,我知道,但它与我的问题无关。因为我已经用 insertable = false, updatable = false 标记了相应的字段
    猜你喜欢
    • 2012-08-19
    • 2021-03-15
    • 2011-03-19
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多