Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 在Hibernate中从Insert中排除自动生成的标识列_Java_Hibernate_Jpa_Db2_Spring Data Jpa - Fatal编程技术网

Java 在Hibernate中从Insert中排除自动生成的标识列

Java 在Hibernate中从Insert中排除自动生成的标识列,java,hibernate,jpa,db2,spring-data-jpa,Java,Hibernate,Jpa,Db2,Spring Data Jpa,我试图使用Hibernate在DB2数据库中插入一个实体。 我的实体有一个@EmbeddedId,而带有@EmbeddedTable的类有一个字段,该字段是DB2表中自动生成的列。在持久化实体时,它因此错误而失败 SQL Error: -798, SQLState: 428C9 DB2 SQL Error: SQLCODE=-798, SQLSTATE=428C9, SQLERRMC=ID, DRIVER=4.9.78 SQL Error: -727, SQLState: 56098 DB2 S

我试图使用Hibernate在DB2数据库中插入一个实体。 我的实体有一个@EmbeddedId,而带有@EmbeddedTable的类有一个字段,该字段是DB2表中自动生成的列。在持久化实体时,它因此错误而失败

SQL Error: -798, SQLState: 428C9
DB2 SQL Error: SQLCODE=-798, SQLSTATE=428C9, SQLERRMC=ID, DRIVER=4.9.78
SQL Error: -727, SQLState: 56098
DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-798;428C9;ID, DRIVER=4.9.78
On release of batch it still contained JDBC statements
Error Refeshing Firmware Level Sources :org.springframework.dao.InvalidDataAccessResourceUsageException: could not perform addBatch; SQL [insert into Db2Schema.table_entity ( ID, KEY1, KEY2, KEY3, .....) values (?, ?, ?, ?, ......)]; nested exception is org.hibernate.exception.SQLGrammarException: could not perform addBatch
这是我的实体(仅显示使用@EmbeddedId的部分)

下面是带有@Embeddeble注释的类:

@Embeddable
public class TableEntityKey implements Serializable{

    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID", insertable = false, updatable = false)
//  @Transient
    private Integer id;

    @Column(name="key1", length=254, insertable=false, updatable=false)
    private String key1;

    @Column(name="key2", nullable=false, length=256, insertable=false, updatable=false)
    private String key2;

    @Column(name="key3", nullable=false, length=256, insertable=false, updatable=false)
    private String key3;

    ..... getters and setters go here ................

}   
POM.xml中的Hibernate依赖项

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.11.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.11.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
    <version>4.3.11.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>4.3.11.Final</version>
</dependency>
插入hibernate生成的语句:

insert into Db2Schema.table_entity ( ID, KEY1, KEY2, KEY3, .....) values (?, ?, ?, ?, ......)
如果它把@Transient注释放在Id字段上,它工作得很好,但我不想使用@Transient注释,因为它会一起忽略这个字段,我需要在我的用例中进一步使用它。我只想在插入过程中忽略此字段。我试图设置insertable=false,但也不起作用


谢谢你的帮助

将标识字段从@Embeddeble类转换为@Entity类对我来说很有用

它现在看起来是这样的:

    @Entity
    @Table(name="table_entity", schema="Db2Schema")
    @DynamicUpdate @DynamicInsert
    public class TableEntity implements Serializable {

        private static final long serialVersionUID = 1L;

        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="ID")
        private Integer Id;

        @EmbeddedId
        private TableEntityKey tableEntityKey;

        ............ Rest of the entity Fields .............

    }


@Embeddable
public class TableEntityKey implements Serializable{


    @Column(name="key1", length=254)
    private String key1;

    @Column(name="key2", nullable=false, length=256)
    private String key2;

    @Column(name="key3", nullable=false, length=256)
    private String key3;

    ..... getters and setters go here ................

}  

如果数据库中的某些内容是“自动生成”的,那么它需要具有身份的
生成策略。面对同样的错误。我也用你的建议编辑了我的问题。如果你真的有身份策略,并且该列定义正确,那么你的JPA提供商将不会在插入中包含该列。您并没有发布表定义的DDL,并没有插入的SQL,所以并没有什么不好的,对此表示歉意。在我的问题中,我现在提供了INSERT、DDL和更详细错误的SQL。首先,在任何身份生成字段上都不需要“insertable”/“updatable”。其次,如果您的JPA提供程序在INSERT语句中标记为IDENTITY时仍然包含“ID”,那么您应该对其提出错误,因为JPA提供程序应该让它在数据存储中生成,我所使用的一个正确地做到了这一点,这显然不符合JPA规范,因为您只能在
@Id
字段上使用
@GeneratedValue
。是的,您是对的。它之所以能够工作,是因为DynamicUpdate和DynamicInsert注释,因为在更新的情况下,ID列不会更改,因此不包括在update语句中,并且在insert期间,其值为null,因此不包括在insert语句中。
insert into Db2Schema.table_entity ( ID, KEY1, KEY2, KEY3, .....) values (?, ?, ?, ?, ......)
    @Entity
    @Table(name="table_entity", schema="Db2Schema")
    @DynamicUpdate @DynamicInsert
    public class TableEntity implements Serializable {

        private static final long serialVersionUID = 1L;

        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="ID")
        private Integer Id;

        @EmbeddedId
        private TableEntityKey tableEntityKey;

        ............ Rest of the entity Fields .............

    }


@Embeddable
public class TableEntityKey implements Serializable{


    @Column(name="key1", length=254)
    private String key1;

    @Column(name="key2", nullable=false, length=256)
    private String key2;

    @Column(name="key3", nullable=false, length=256)
    private String key3;

    ..... getters and setters go here ................

}