2015-12-10 79 views
1

尊者是Oracle視圖vendor_view和表廠商(廠商表僅包含PK與名ID爲簡單起見)JPA插入和可更新與查看和SecondaryTable

create view vendor_view as 
    select id as vid, 'YES' as active 
    from vendors; 

Coresponding實體

@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產生插入查詢該標記爲插入=假,可更新=假場?

+0

在這裏看到我的答案http://stackoverflow.com/a/37160701/1356423。除非你明確地設置了一個映射到'@ SecondaryTable'的字段(如果它是一個視圖,你不應該這麼做),否則不會執行插入更新語句。如果是,那麼即使所有其他字段映射爲不可插入/可更新,也會爲ID列創建插入語句。 –

回答

0

由於hibernate並不知道你試圖插入的表是一個表還是一個視圖,除非它與數據庫交互。所以它是運行時異常,只有Java程序與數據庫交互時才能檢查。

即使表格不存在,它也會進行查詢,但在運行時會引發異常。

+0

對於這perpues insertable = false,updatable = false設置... – Alstresh

0

如果相關實體的責任creating/udpating不在當前實體中,您會這樣做。例如。你有一個Person和一個Address。您想在Address實體中將insertable=false,updatable=false添加到@OneToMany relationship,Person實體中,因爲它不是Address實體創建或更新Person的責任。這是相反的。這不是真正的技術性,而是更多的語義/自然決定。

+1

是的,我知道它,但它沒有連接到我的問題。因爲我已標記相應的字段與insertable = false,updatable = false – Alstresh