【问题标题】:GeneratedValue with oracle and hibernate does not work使用 oracle 和休眠的 GeneratedValue 不起作用
【发布时间】:2012-11-06 01:48:31
【问题描述】:

我在使用 Oracle XE 数据库的项目中遇到了 GeneratedValue 注释的问题。该值根本不会生成 - 尝试使用自动生成的字段在表中插入行时,我不断收到错误消息。

"Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("SYSTEM"."T_VAPP"."VAPPID")"

完全相同的代码适用于 Derby 或 MySQL,但我需要使其适用于 Oracle,它似乎忽略了我在生成的字段定义中输入的任何内容。我尝试使用 GenerationType.TABLE、GenerationType.SEQUENCE 但同样的错误仍然存​​在。我还使用 Oracle SQL 开发人员验证了没有创建代码中定义的序列。我在这里想念什么?

@Entity
@Table(name = "T_vApp")
@RooJavaBean
@RooToString
@RooJpaActiveRecord(identifierColumn = "vAppId", identifierField = "id",  table = "T_vApp")
public class VLabApplication {



  @Id
  @GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
  @SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
  @Column(name = "vAppId" )
  private Long id;

【问题讨论】:

    标签: oracle spring hibernate jpa spring-roo


    【解决方案1】:

    我怀疑它可能会混淆,因为您在两个地方告诉它标识符字段是什么。另外,您使用 @Table 和 @RooJpaActiveRecord 注释中的参数来告诉它。您可能应该从类的 @RooJpaActiveRecord 注释中删除所有参数。在类“id”成员上保留@Id 和@Column 注释,在类上保留@Table 注释。

    或者,您可能需要切换到自定义生成器类,该生成器类会根据哪个数据库执行正确的操作。

    【讨论】:

    • 确实 - 标识符定义太多。我按照描述删除了它们,但仍然是同样的错误。将尝试创建一个新项目,以测试当前项目是否有问题。
    【解决方案2】:

    您使用了GenerationType.AUTO 而不是GenerationType.SEQUENCE

    【讨论】:

    • AUTO for oracle 将选择序列生成器(这就是为什么它被称为 'AUTO' ;))。
    【解决方案3】:

    GenerationType.AUTO 是正确的 --- 这将确保您的代码适用于 oracle 以及 mysql(无需更改您的代码)。我就是这样用的,从来没出过问题。

    尝试移除@Roo 魔法,生成setter/getter,看看是否有帮助。顺便说一句,我通常注释吸气剂。我不认为这是问题所在,但如果其他一切都失败了,您可以随时尝试。

    我的猜测是 roo 和 hibernate 之间的一些问题(我从未使用过也没有读过关于 roo 的内容,所以它真的是一个猜测)。

    【讨论】:

    • Spring Roo 只是使用 AspectJ 来简化您的 POJO,例如在 AJ 文件的编译时生成所有的 get/set 方法、toString() 方法。它还有其他一些帮助,但在大多数情况下,Roo 注释只是通过删除样板文件来简化你的 java 代码。
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多