【问题标题】:Defining database independent JPA object uid定义独立于数据库的 JPA 对象 uid
【发布时间】:2010-08-04 15:02:08
【问题描述】:

事实证明,以下示例在使用 mysql 5.x 时有效,但在使用 oracle 10g 数据库时无效。

有没有办法定义一个独立于数据库技术的唯一标识符字段?

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private long id;

我在hibernate中对此进行了测试,只有在使用Oracle时才会出现以下异常:

org.hibernate.MappingException: Dialect does not support identity key generation

【问题讨论】:

  • 为什么不用GenerationType.AUTO 让提供者根据数据库选择最优策略?

标签: java hibernate jpa datanucleus


【解决方案1】:

使用数据库表是一种生成标识符的可移植方式。

使用表生成标识符的最简单方法是指定TABLE作为生成策略:

@Id
@GeneratedValue(strategy=GenerationType.TABLE)
@Column(name="id")
private long id;

如果您使用模式生成,提供程序将创建默认表;如果没有,您必须指定一个现有的表:

@TableGenerator(name="InvTab",
    table="ID_GEN",
    pkColumnName="ID_NAME",
    valueColumnName="ID_VAL",
    pkColumnValue="INV_GEN")
@Id 
@GeneratedValue(generator="InvTab")
@Column(name="id")
private long id;

http://www.oracle.com/technology/products/ias/toplink/jpa/howto/id-generation.html#table

【讨论】:

    【解决方案2】:

    我已经使用GenerationType.AUTO 进行了研究,它似乎确实是更好的选择。它允许 JPA 实现选择最适合您正在使用的数据存储系统的方式。

    【讨论】:

    • GenerationType.AUTO 的问题是提供者需要拥有数据库权限才能创建表或序列,如果它选择其中任何一种策略。通常这是仅限于 DBA 的特权操作。在这种情况下,您需要确保在 AUTO 策略能够起作用之前创建持久性资源。
    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多