Java 尝试使用自动生成的ID持久化新(非托管)实体会导致错误
我有一个Java 尝试使用自动生成的ID持久化新(非托管)实体会导致错误,java,jpa,derby,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", "val
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=“更新序列集
序号计数=序号计数+?其中序号名称=?“”)
原因:java.sql.SQLSyntaxErrorException:表/视图“序列”不存在
我试图改变@GeneratedValue
的策略,但没有成功。网上有很多类似的问题,但没有明确的解决方案,在这种情况下该怎么办
我是否需要为新的非托管实体中的
id
列指定特定值?是否需要在id
列所在的表中设置特定值(我只设置它是主键)?您使用的是什么数据库
声明持久性提供程序将选择最合适的解决方案
如果您使用的是Hibernate,您是否正确地显式设置了方言?我经常看到Hibernate试图猜出正确的方言,但猜错了。这可能会造成自动策略选择不当的多米诺效应。使用标识由DB生成ID:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
不要添加optional=false,nullable=false。在RDB中,主键永远不会为空。paste pesrsistence.xml这确实有效,我之前也使用过它。我相信问题出在我的表和我创建主键的方式上。不幸的是,我不确定出了什么问题,但我认为Netbeans derby插件的Add列中的“增量1”解决了这个问题。哦,还有一件重要的事情我忘了提到。如果从Netbeans中的数据库自动生成类,则所有新创建的类都需要用户在其构造函数中设置ID。我传递了0和其他值,希望它们被忽略,但最终从构造函数中删除了ID并添加了标识策略。