使用oracle和hibernate生成的值不起作用
我在使用Oracle XE数据库的项目中遇到了GeneratedValue注释的问题。该值根本不会生成-我在尝试使用自动生成字段在表中插入行时一直会遇到错误使用oracle和hibernate生成的值不起作用,oracle,spring,hibernate,jpa,spring-roo,Oracle,Spring,Hibernate,Jpa,Spring Roo,我在使用Oracle XE数据库的项目中遇到了GeneratedValue注释的问题。该值根本不会生成-我在尝试使用自动生成字段在表中插入行时一直会遇到错误 "Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("SYSTEM"."T_VAPP"."VAPPID")" 完全相同的代码适用于Derby或MySQL,但我需要使其适用于Oracle,它似乎忽
"Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("SYSTEM"."T_VAPP"."VAPPID")"
完全相同的代码适用于Derby或MySQL,但我需要使其适用于Oracle,它似乎忽略了我在生成的字段定义中输入的任何内容。我尝试使用GenerationType.TABLE、GenerationType.SEQUENCE,但相同的错误仍然存在。我还使用OracleSQLDeveloper验证了代码中定义的序列都没有被创建。我错过了什么
@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;
您使用了
GenerationType.AUTO
而不是GenerationType.SEQUENCE
GenerationType.AUTO
是正确的--这将确保您的代码适用于oracle和mysql(无需更改代码)。我这样使用它,从来没有任何问题
尝试删除@Roo
魔法,生成setter/getter,看看这是否有帮助。顺便说一句,我通常对getter进行注释。我不认为这是个问题,但是如果其他一切都失败了,你可以尝试一下
我的猜测是roo和hibernate之间存在一些问题(我从未使用过或阅读过roo,因此这确实是一个猜测)。我怀疑它可能会变得混乱,因为您在两个地方告诉它标识符字段是什么。另外,您可以通过@Table和@rookpaactiveRecord注释中的参数来说明这一点。您可能应该删除类上@RooJpaActiveRecord注释中的所有参数。在类“Id”成员上保留@Id和@Column注释,在类上保留@Table注释
或者,您可能需要切换到根据哪个数据库执行正确操作的自定义生成器类。AUTO for oracle将选择sequence generator(这就是为什么它被称为“AUTO”)。事实上,标识符定义太多了。我按照描述删除了它们,但仍然是相同的错误。Spring Roo只是使用AspectJ来简化POJO,例如在编译时在AJ文件中生成所有get/set方法,即幕后的toString()方法。它还提供了其他一些帮助,但在大多数情况下,Roo注释只是通过删除样板文件来简化java代码。