2

我在使用 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;
4

3 回答 3

2

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

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

于 2012-11-19T02:22:46.507 回答
2

GenerationType.AUTO是正确的 --- 这将确保您的代码适用于 oracle 和 mysql(无需更改您的代码)。我像这样使用它,从来没有任何问题。

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

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

于 2012-11-18T15:51:32.100 回答
1

你用GenerationType.AUTO而不是GenerationType.SEQUENCE

于 2012-11-17T16:43:25.520 回答