2014-10-17 44 views
0

我試圖做一個插入選擇與Jpa。 上,我嘗試做實體是這樣的:插入選擇與jpa錯誤

@Entity 
public class A { 
    private String fieldOne; 
    private String fieldTwo; 
    private String fieldThree; 
    private B fieldFour; 

    @Id 
    public String getFieldOne(){...} 
    @Id 
    public String getFieldTwo(){...} 
    @Id 
    @OneToOne 
    public B getFieldThree(){...} 

    public String getFieldFour(){...} 
    .... 


@Entity 
public class B { 
    private CompositeId id; 
    .... 

    @EmbeddedId 
    public CompositeId getId(){ 
     return MyUUIDGenerator.generateCompositeId(); 
    } 
    .... 

我試圖插入圖是非常簡單的:

insert into A (fieldOne, fieldTwo, fieldThree, fieldFour) 
    select 'staticValueOne', 'staticValueTwo', B.id, 'staticValueFour' from B 
    where .... 

的「staticValueX」是由應用程序計算出的值是對於一組給定的B元素,我需要全部相等。

在執行過程中的應用程序返回異常:

java.lang.IllegalArgumentException異常:org.hibernate.QueryException:散裝的一部分,與任何一個序列或 插入柱式發電機可以插入只 IDS產生[插入...

我不明白爲什麼,因爲我沒有在A中產生任何值,我給插入它所需要的所有值。 有沒有人有建議瞭解這種行爲?

謝謝!

編輯:一點點更新...

我改變了A級只有標記爲@Id字符串類型的字段,但是Hibernate會錯誤建設正確的查詢:表別名協會與字段名稱錯過一些領域。

+0

jpa不支持在jpa中插入語句,只能選擇,更新和刪除。堅持你需要使用entitymanager和對象樣式的數據。 – 2014-10-17 13:35:14

+0

你是否執行該插入作爲本機查詢?因爲IMO以一種並不真正需要的方式混合使用JPA和SQL,這使事情變得複雜。此外,您應該只應用@Id [某些類型的字段](http://docs.oracle.com/javaee/6/api/javax/persistence/Id.html) – fvu 2014-10-17 13:35:51

+0

我正在使用Jpql,沒有本機查詢。由於性能問題,我被迫使用這種類型的插入。我也試過去掉所有的Id,在Embedded中插入相同的B.id值,並且嵌入工作完美。但我無法使用此解決方法。 – 2014-10-17 13:40:42

回答

0

JPA 2.0規範,章4.2語句類型

一個Java持久化查詢語言的語句可以是一個選擇 語句,更新語句或DELETE語句。 (...)

在BNF語法,查詢語言陳述的定義爲:

QL_statement :: = select_statement中| update_statement | delete_statement

相反SELECT語句的未在JPA支持(無論是在JPQL或標準API)對實體使用ElementManager.persist一個事務中。當事務提交時,實體被寫入數據庫(SQL INSERT將由作爲持久性提供者的Hibernate隱式完成)。

編輯:如果有大量的插入,你可以仔細看看Hibernate的批量插入。另一種選擇是放棄JPA並直接使用JDBC批量插入(PreparedStatement)。

+0

不幸的是,我不能使用persist,因爲它太慢了:存儲2000條記錄需要大約4秒鐘,生產上的這個查詢將對大部分2/3百萬條記錄起作用。所以我需要找到解決方法,我發現的唯一想法是使用插入到選擇。 – 2014-10-20 07:43:57

+0

@Stefania Lori我已經更新了我的答案。 – wypieprz 2014-10-20 08:10:28

+0

我在Hibernate中也發現了這個文檔:https://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch11.html#d5e2610,如果我沒有錯,它似乎支持插入選擇,即使它實際上不起作用 – 2014-10-22 09:17:31