sfr*_*frj 3 java orm jpa java-ee java-ee-6
我想使用SEQUENCE策略自动生成id,但我正在打破我的头脑才能使它工作.我根本不知道为什么我不能让它发生.
这就是我做的.首先,我有一个实体:
@Entity
@SequenceGenerator(name="VlasnikSeq", sequenceName="VLA_SEQ")
public class Vlasnik implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="VlasnikSeq")
private Long id;
//...
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
当我使用eclipses功能为实体生成表时,我得到这个:

如您所见,表已创建,但没有SEQUENCE表.我还在控制台中注意到以下消息,而JPA正在创建表:
[EL警告]:异常[EclipseLink-4002](Eclipse Persistence Services - 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;
Run Code Online (Sandbox Code Playgroud)
但我收到以下消息:
序列'VLA_SEQ'已经存在.
我完全糊涂了.我不知道该怎么办.我只想在DB中创建新行时自动生成实体的ID.
这是我第一次使用glassfish 3.1,在版本3.0中我不记得,有这个问题,我甚至可以使用@GenneratedValue.我很感激一些帮助.
要使用GeneratedValue,您必须指定策略和生成器.默认情况下,策略为AUTO,生成器为空.
可用策略由GenerationType定义:
public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };
Run Code Online (Sandbox Code Playgroud)
最常用的方法是指定SEQUENCE或IDENTITY.
对于使用SEQUENCE的数据库(如Oracle和HSQLDB),还必须使用SequenceGenerator注释:
公共类MyClass {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQMYCLASSID")
@SequenceGenerator(name="SEQMYCLASSID", sequenceName="SEQMYCLASSID")
private Long id;
Run Code Online (Sandbox Code Playgroud)
}
如果您具有自动DDL启用,则无需创建序列,因为JPA提供程序将为您执行此操作.如果不是这样的话,你必须像这样手动完成:
CREATE SEQUENCE SEQMYCLASSID;
Run Code Online (Sandbox Code Playgroud)
对于不使用squences并使用Microsoft SQL Server等标识列的数据库,您需要将IDENTITY指定为策略:
公共类MyClass {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
9383 次 |
| 最近记录: |