尝试保留具有自动生成的ID的新(非托管)实体会导致错误

时间:2019-03-15 17:16:12

标签: java jpa derby

我有一个MyEntity类,其中有几列,其中一列是自动增量ID。 MyEntity如下所示:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Basic(optional = false)
@Column(nullable = false)
private Long id;

当我创建一个新的MyEntity并设置所有其他列(我没有设置id列)时,然后调用persist

MyEntity mn = new MyEntity("val1", "val2");
em.getTransaction().begin();
em.persist(mn);
em.getTransaction().commit();
em.close();

发生以下错误:

  

查询:DataModifyQuery(name =“ SEQUENCE” sql =“ UPDATE SEQUENCE SET   SEQ_COUNT = SEQ_COUNT +? SEQ_NAME =吗?“)

     

由以下原因引起:java.sql.SQLSyntaxErrorException:表/视图'SEQUENCE'不存在。

我试图更改@GeneratedValue的策略无济于事。在线上有很多类似的问题,但是在这种情况下没有明确的解决方案。

我是否需要为新的非托管实体中的id列分配某个值?我是否需要在id列所在的表中设置特定的值(我仅将其设置为主键)?

2 个答案:

答案 0 :(得分:1)

使用标识通过数据库生成ID:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

请勿添加optional = false,nullable = false。在RDBS中,主键永远不会为空。

答案 1 :(得分:0)

您正在使用哪个数据库?

https://docs.oracle.com/javaee/6/api/javax/persistence/GenerationType.html#AUTO声明持久性提供程序将选择最合适的解决方案。

如果使用的是Hibernate,是否已正确正确设置方言?我经常看到Hibernate尝试猜测正确的方言,但却弄错了。这可能会导致错误选择AUTO策略的多米诺骨牌效应。