相关疑难解决方法(0)

JPA GenerationType.AUTO没有考虑具有自动增量的列

我有一个表与一个简单的int id列在SQL Server中具有标识自动增量.

实体的Id用@Id和注释@GeneratedValue

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", length = 4, precision = 10, nullable = false)
private Integer id;
Run Code Online (Sandbox Code Playgroud)

在SQL Server中,该列已正确设置为Identity with Seed并且Increment等于1.

当我尝试持久化该实体的实例时,Hibernate尝试查询hibernate_sequence表以获取ID值.由于我没有在我的架构中创建该表,我收到一个错误:

could not read a hi value: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'MySchema.hibernate_sequence'

如果我将生成类型更改为IDENTITY,一切都按预期工作

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", length = 4, precision = 10, nullable = false)
private Integer id;
Run Code Online (Sandbox Code Playgroud)

我无法以这种方式更改它,因为我的应用程序将在MS SQL和ORACLE上运行,后者不支持自动增量列.

据我所知,如果底层数据库对它有支持,AUTO类型应该使用自动增量行为,所以我不知道为什么不工作.

更新:

我花了一些时间,但我能够准确理解发生了什么.

我正在使用具有以下行为的旧数据库:

  • MSSQL:id生成使用表IDENTITY
  • ORACLE:id生成使用触发器.触发器查询并更新存储所有"下一个ID"的自定义表.该表称为SEQ.

以下是使用一些id生成策略的结果:

  • AUTO:在MSSQL中不起作用,如上所述
  • IDENTITY:在MSSQL中有效,但Oracle不支持
  • "native":在MSSQL中工作但在ORACLE中失败.它失败了,因为Hibernate激活了它的默认序列策略,它使用了hibernate_sequences.nextval.由于这是一个传统应用程序从SEQ表(上述)的值和hibernate_sequences 不同步(SEQ的该特定的表值是在6120,和hibernate_sequences'为1,因为它没有使用到现在为止,预计).

所以我需要弄清楚的是将该实体配置为: …

java database sql-server hibernate jpa

10
推荐指数
2
解决办法
2万
查看次数

使用 Hibernate 和 SQL Server 2008 时出现问题

我在使用 Hibernate 和 SQL Server 2008 时遇到问题。当我尝试将对象保存到数据库时,Hibernate 会抛出以下错误:

could not retrieve snapshot: com.my.MyClass

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name `'emanagement.patient_visit'.`
Run Code Online (Sandbox Code Playgroud)

用户拥有数据库的选择、插入、更新权限。所以我排除了这个问题。

这是生成的 SQL:

select
        patientvis_.account_number,
        patientvis_.status as status1_,
        patientvis_.cpt_code as cpt3_1_,
        patientvis_.locked as locked1_,
        patientvis_.state as state1_,
        patientvis_.userid as userid1_ 
    from
        emanagement.patient_visit patientvis_ 
    where
        patientvis_.account_number=?
Run Code Online (Sandbox Code Playgroud)

如果我在 SQL Server 中运行上述 SQL,它会显示无效的对象名称 emanagement.patent_visit,但如果我手动添加“dbo”emanagement.dbo.patent_visit,它将被执行。

那么我还需要进行其他 Hibernate 配置吗?

这是我的 Hibernate 映射。下面的映射在 MySQL 下工作。我可以读取并更新数据库中的病人访问。但当切换到 MS Server 时,它失败了。我尝试过其他适用于 MySQL 和 MS Server 的休眠映射,它们都使用与下面相同的声明,如 table="db_table" schema="my_database"。唯一的区别是我在 MS Server 下创建了这个新的电子管理数据库,所以我认为我错过了 MS Server 管理工具上的一些特定数据库配置。证明这一点的唯一方法是将新表从电子管理移动到现有数据库,看看它是否有效。

<class name="com.domain.patient.model.PatientVisit" table="patient_visit"    schema="emanagement">
        <id …
Run Code Online (Sandbox Code Playgroud)

java database sql-server hibernate

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

database ×2

hibernate ×2

java ×2

sql-server ×2

jpa ×1