【发布时间】:2015-09-01 15:59:35
【问题描述】:
我想知道正确的 JPA 注释设置来处理 MS Server 2008 R2 IDENTITY 列。
MS Server 2008 R2 (RTM) 不支持 SEQUENCE,但是当我通过原始 sql 测试时,IDENTITY 会自动递增。
但是,通过 JPA,我无法通过 @GeneratedValue 注释上的任何策略(IDENTITY、AUTO、TABLE)使其工作,并且我不允许更改数据库架构,因为它是其他架构。我没有尝试使用 SEQUENCE,因为没有序列。
数据库表架构
CREATE TABLE [dbo].[invoice_header](
[invoice_id] [int] IDENTITY(1,1) NOT NULL,
[ApprovalDate] [datetime] NULL,
[ApproverUserName] [nvarchar](50) NULL,
CONSTRAINT [PK_invoice_header] PRIMARY KEY CLUSTERED
(
[invoice_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
JPA 注释
@Entity
@Table(name = "invoice_header")
public class InvoiceHeader {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
@Column(name="invoice_id")
private Long invoiceId;
休眠错误
Hibernate: insert into tbl_acct_textura_invoice_header (invoice_id, ApprovalDate, ApproverUserName) values (null, ?, ?)
2015-06-16 11:12:24.149 ERROR 7157 --- [tp1024240671-18] o.h.engine.jdbc.spi.SqlExceptionHelper : DEFAULT or NULL are not allowed as explicit identity values.
由于在 Id 上传递了 null 而失败。我可以通过 @Column 注释上的 insertable=false 和 updatable=false 在插入期间使 HQL 不包括 invoice_id 列,但是休眠对不包括如下所示的 Id 列不满意。有什么建议吗?仅供参考,我正在使用 spring-data JpaRepository
插入期间不包含 id 列时出现休眠错误
nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): ...InvoiceHeader
【问题讨论】:
-
IDENTITY 数据库字段应该使用“IDENTITY”策略,这就是它的用途,并且在我尝试过时可以与 DataNucleus 一起使用。如果 Hibernate 不支持,请报告针对他们的错误或查找更新的版本
-
感谢 Neil 的建议,但我发现我错过了在 LocalContainerEntityManagerFactoryBean 上设置方言
标签: hibernate sql-server-2008 jpa spring-data-jpa