Java 在Hibernate中从Insert中排除自动生成的标识列
我试图使用Hibernate在DB2数据库中插入一个实体。 我的实体有一个@EmbeddedId,而带有@EmbeddedTable的类有一个字段,该字段是DB2表中自动生成的列。在持久化实体时,它因此错误而失败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
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 ................
}