插入到选择jpa错误

时间:2014-10-17 13:26:59

标签: java oracle hibernate jpa weblogic

我正在尝试使用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:可以   只生成id作为批量插入的一部分,具有序列或   插入后样式生成器[插入...

我不明白为什么,因为我在A中没有任何生成的值,我给插入所需的所有值。 有没有人建议理解这种行为?

谢谢!

编辑:稍微更新一下......

我改变了A类,只有一个String类型的字段标记为@Id,但是hibernate在正确构建查询时会出错:表别名与字段名称的关联会遗漏一些字段。

1 个答案:

答案 0 :(得分:0)

JPA 2.0规范 ,章 4.2声明类型

  

Java Persistence查询语言语句可以是select   语句,更新语句或删除语句。 (...)

     

在BNF语法中,查询语言语句定义为:

     

QL_statement :: = select_statement | update_statement | delete_statement

而不是JPA中不支持的SELECT语句(在JPQL或Criteria API中),而是在事务中的实体上使用ElementManager.persist。当事务提交时,实体被写入数据库(SQL INSERT将由Hibernate隐式完成,它充当持久性提供者)。

编辑:如果插入次数很多,您可以仔细查看Hibernate的批量插入。另一个选择是放弃JPA并直接使用JDBC的批量插入(PreparedStatement)。