我想使用SEQUENCE策略自动生成ID,但是我很想让它工作。我根本不知道为什么我不能实现它。
这就是我的意思。 首先,我有一个实体:
@Entity
@SequenceGenerator(name="VlasnikSeq", sequenceName="VLA_SEQ")
public class Vlasnik implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="VlasnikSeq")
private Long id;
//...
我在persistence.xml中的映射了它:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="sampleAplication">
<class>entities.Vlasnik</class>
<class>entities.Ljubimac</class>
</persistence-unit>
</persistence>
当我使用日食功能为实体生成表时,我得到了这个:
如您所见,表格已创建,但没有SEQUENCE表格。 我还在控制台中注意到以下消息,而JPA正在创建表:
[EL警告]:异常[EclipseLink-4002](Eclipse持久性 服务 - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException内部 例外:java.sql.SQLSyntaxErrorException:SEQUENCE'VLA_SEQ' 不存在。
我认为下一步是尝试运行应用程序,看看我是否可以创建一些行。但是当我试图坚持某些东西时,我得到一个例外:
org.apache.derby.client.am.SqlException:SEQUENCE'VLA_SEQ'不
所以我得出结论,由于某种原因我需要那个表,所以我转到数据库管理的角度,我尝试执行以下查询:
CREATE SEQUENCE VLA_SEQ;
但我收到以下消息:
序列'VLA_SEQ'已经存在。
我完全糊涂了。我不知道该怎么办。我只想在数据库中创建新行时自动生成实体的ID。
这是我第一次使用glassfish 3.1,在版本3.0中我不记得,有这个问题,我甚至可以使用@GenneratedValue。 我很感激一些帮助。
答案 0 :(得分:7)
为了使用GeneratedValue,您必须指定策略和生成器。默认情况下,策略为 AUTO ,生成器为空。
可用策略由 GenerationType :
定义public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };
最常用的方法是指定 SEQUENCE 或 IDENTITY 。
对于使用 SEQUENCE 的数据库,例如Oracle和HSQLDB,您还必须使用 SequenceGenerator 注释:
公共类MyClass {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQMYCLASSID")
@SequenceGenerator(name="SEQMYCLASSID", sequenceName="SEQMYCLASSID")
private Long id;
}
如果您启用了自动DDL,则无需创建序列,因为JPA提供程序将为您执行此操作。如果不是这种情况,你必须像这样手动完成:
CREATE SEQUENCE SEQMYCLASSID;
对于不使用squences并使用Microsoft SQL Server等标识列的数据库,您需要将 IDENTITY 指定为策略:
公共类MyClass {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
}