【问题标题】:persist a 1 column table using JPA使用 JPA 持久化 1 列表
【发布时间】:2011-10-06 05:10:19
【问题描述】:

我有一张只有一列的表格。这是一个身份

如何使用 JPA 持久化它?

我试过 entityManager.persist(new OneColumnTable());

它会抛出一个 PersistenceException

Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-6023] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.QueryException
Exception Description: **The list of fields to insert into the table [DatabaseTable(OneColumnTable)] is empty.  You must define at least one mapping for this table.**
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:747)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.flush(EntityManagerWrapper.java:418)

我该怎么做?

更新

@Entity
@Table(name = "OneColumnTable")
public class OneColumnTable implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "OneColumn")
    private Integer oneColumn;

    public OneColumnTable() {

    }

    public Integer getOneColumn() {
        return oneColumn;
    }

    public void setOneColumn(Integer oneColumn) {
        this.oneColumn= oneColumn;
    }

}

表格

USE [myDB]
GO
/****** Object:  Table [dbo].[OneColumnTable]    Script Date: 07/15/2011 12:10:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[OneColumnTable](
    [OneColumn] [bigint] IDENTITY(1,1) NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [OneColumn] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

【问题讨论】:

  • 您想这样做似乎很奇怪。我还没有遇到可以理解insert into OneColumnTable() values(); 的RDBMS。也许这里存在设计问题。
  • 肯定是设计问题,但他们希望我这样做,所以我想知道是否有可能:(
  • 许多 RDBMS 支持这样的声明......但请参阅下面的答案,有不同的 sintaxis

标签: java sql-server jpa jpql


【解决方案1】:

DataNucleus 可以很好地保留该类。问题是对于某些 RDBMS,当没有指定列时,INSERT 语句必须属于特定类型(因为在数据存储中生成了唯一的列),这可能是它无法做到的。对于 SQLServer,任何体面的 JPA 实现都应该生成的语句是“INSERT INTO {tbl} DEFAULT VALUES”。也许得到一个实现?

【讨论】:

    【解决方案2】:

    @GeneratedValue(strategy=GenerationType.IDENTITY) 表示使用依赖于database support for IDENTITY columns 的排序策略。

    IDENTITY 列的概念并非在所有数据库中都存在。例如,Apache Derby 和 Oracle 不支持这一点,而 MySQL、MSSQL(通常是 Sybase)支持 IDENTITY 排序策略。您应该使用数据库支持的排序策略。为了便携性,选择AUTOTABLE 排序策略。在大多数 JPA 提供程序中,AUTO 策略被实现为TABLE 排序策略,因为所有数据库都支持创建用于维护序列值的表。

    【讨论】:

    • 是否有更大的堆栈跟踪?据我所见,就这种行为在 MSSQL 中涉及的 IDENTITY 排序而言,没有针对 EclipseLink 的开放错误,而且我看不出这个简单的案例是如何失败的。不幸的是,我没有访问 MSSQL 实例的权限,所以我需要查看 EclipseLink 的源代码来帮助您;这就是为什么我会对精确定位故障确切位置的堆栈跟踪感兴趣的原因。
    • SQLServer 绝对支持 IDENTITY 关键字,因此支持 JPA "IDENTITY" 值生成。
    • @DataNucleus,这里没有人怀疑 MSSQL 是否支持 IDENTITY 列。这可能是 EclipseLink 针对 MSSQL 平台触发的边缘案例。对 IDENTITY 排序的支持依赖于发出 SELECT @@IDENTITY 查询,如 org.eclipse.persistence.platform.database.SQLServerPlatform 类中编码的那样。只有在数据库中触发插入后才会发出查询本身。插入后查询很可能失败,但没有办法知道失败的原因,或者它是否是失败的初始点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2013-11-12
    • 1970-01-01
    • 2011-12-01
    • 2019-07-17
    • 2013-02-25
    相关资源
    最近更新 更多