尝试使用自动生成的ID持久保存新的(非托管)实体会导致错误

问题描述 投票:1回答:2

我有一个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 +?WHERE SEQ_NAME =?”)

引起:java.sql.SQLSyntaxErrorException:表/视图'SEQUENCE'不存在。

我试图改变@GeneratedValue的策略,但没有用。网上有很多类似的问题,但在这种情况下没有明确的解决方案。

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

java jpa derby
2个回答
1
投票

使用identity通过DB生成ID:

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

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


0
投票

你用的是什么数据库?

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

如果您正在使用Hibernate,请明确正确设置方言吗?我经常看到Hibernate尝试猜测正确的方言,但却弄错了。这可能导致AUTO策略的多米诺骨牌效应选择不当。

© www.soinside.com 2019 - 2024. All rights reserved.