我在使用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;
答案 0 :(得分:2)
GenerationType.AUTO
是正确的---这将确保您的代码适用于oracle和mysql(无需更改代码)。我像这样使用它,从来没有遇到任何问题。
尝试删除@Roo
魔法,生成setter / getter并查看是否有帮助。顺便说一下,我通常会对吸气剂进行注释。我不认为这是问题,但如果其他一切都失败,你总是可以尝试。
我的猜测是roo和hibernate之间的一些问题(我从未使用过或读过关于roo的内容,所以它实际上是 guess )。
答案 1 :(得分:2)
我怀疑它可能会变得混乱,因为你在两个地方告诉它标识符字段是什么。另外,你用@Table和@RooJpaActiveRecord注释中的参数告诉它。您应该删除类中@RooJpaActiveRecord注释的所有参数。将@Id和@Column注释保留在类“id”成员和类上的@Table注释中。
或者,您可能需要切换到自定义生成器类,该类根据哪个数据库执行正确的操作。
答案 2 :(得分:1)
您使用GenerationType.AUTO
代替GenerationType.SEQUENCE