1

如何在 ejb3 和 PostgreSQL 中使用 Serial 和 bigSerial?

4

2 回答 2

2

假设当您说 EJB3 时,您打算使用Java Persistence API (JPA),它是 Java EE 5 中 EJB3 规范的一部分,并在 Java EE 6 中分离为 JPA 2:

使用Integeror Long(通常@Column的注释)和@GeneratedValue带有 . 的注释来映射它@SequenceGenerator

假设您的serialorbigserial列是一个标识列,并且您使用的是 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 规范。

于 2012-07-03T15:10:12.257 回答
1

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;
    }

...........

于 2012-07-05T11:14:09.723 回答