2012-11-17 20 views
2

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

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

完全相同的代码与德比或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; 

回答

1

您使用GenerationType.AUTO代替GenerationType.SEQUENCE

+0

AUTO for oracle将选择序列生成器(这就是为什么它被称为'AUTO';))。 – ishi

+0

谢谢,我实际上尝试了AUTO和SEQUENCE ... –

2

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

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

我的猜测是roo和hibernate之间的一些问题(我从来没有用过也没有读过roo,所以它确实是猜测)。

+0

Spring Roo只是使用AspectJ来简化POJO,比如生成所有get/set方法,在AJ文件中编译时在后台生成toString()方法。还有其他的东西可以帮到你,但大部分Roo注释只是通过删除样板文件来简化你的java代码。 – tgharold

2

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

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

+0

确实 - 标识符定义太多。我按照描述删除了它们,但仍然是相同的错误。将尝试创建一个全新的项目,以测试是否与当前项目横向一致。 –