如何在 ejb3 和 PostgreSQL 中使用 Serial 和 bigSerial?
2 回答
假设当您说 EJB3 时,您打算使用Java Persistence API (JPA),它是 Java EE 5 中 EJB3 规范的一部分,并在 Java EE 6 中分离为 JPA 2:
使用Integer
or Long
(通常@Column
的注释)和@GeneratedValue
带有 . 的注释来映射它@SequenceGenerator
。
假设您的serial
orbigserial
列是一个标识列,并且您使用的是 Java EE 6 中的 JPA 2,您将编写如下内容:
@Entity
@Table(name = "thetable")
public class TheTable implements Serializable {
@Id
@SequenceGenerator(name="tablename_id_seq", sequenceName="tablename_id_seq", allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="tablename_id_seq")
@Basic(optional = false)
@NotNull
@Column(name = "id", updatable=false)
private Integer id;
// other columns...
// then accessors ("getters and setters")
}
如果是 BigSerial,则使用Long
代替Integer
,否则无需更改。
我没有检查以上内容在 EJB3 中包含的原始 JPA 的 Java EE 5 中是否有效。如果您需要在 Java EE 5 上支持 JPA1,您可能需要进行更多检查。如果您必须支持 Java EE 5,我建议您从 JPA 的JSR 220 规范开始,但最好还是迁移到 JPA2 和 Java EE 6 容器。
请注意,应该可以简单地使用GenerationType.IDENTITY
并避免为每个实体手动定义序列。不幸的是,至少对于 Hibernate,它假设您想对所有表使用全局“休眠”序列,这很愚蠢。
allocationSize=1
很重要。令人沮丧的是,JPA 指定最小 fetch 大小为 50,并期望序列在nextval()
被调用时以 50 的跳跃递增。除非您的序列是这样定义的,否则您将得到重复的键错误。
您将需要一个META-INF/persistence.xml
文件来启用 JPA。对实体的访问是通过EntityManager
您从 中获取的,EntityMangerFactory
或者更常见的是通过使用@PersistenceContext
. 请参阅 JPA 文档和关于 'net.
大多数应用程序服务器都带有 JPA 实现。Glassfish 3 附带 EclipesLink 和 JBoss AS 7 附带 Hibernate 4。请参阅应用程序服务器的文档和 JPA 规范。
GenerationType.IDENTITY 适用于连续剧
CREATE TABLE vmb_mails (ID SERIAL PRIMARY KEY ,TITLE TEXT ........
@Entity
@Table(name="vmb_mails")
@NamedQueries(
@NamedQuery(name="getAllMails",query="SELECT m from Mail m ORDER by m.entDate DESC ")
)
//@SequenceGenerator(name="Mails_Seq_Gen",sequenceName="vmb_mails_seq",allocationSize=1)
public class Mail implements Serializable
{
private long id;
private String title;
private String fromAddr;
public Mail()
{
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
...........