使用SERIAL和BIGSERIAL w / EJB3和Postgres

时间:2012-07-03 06:51:59

标签: java ejb ejb-3.0 postgresql-9.1

如何使用串口和bigSerial与ejb3和PostgreSQL?

2 个答案:

答案 0 :(得分:2)

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

使用IntegerLong,常用的@Column注释以及带有@GeneratedValue@SequenceGenerator注释进行映射。

假设您的serialbigserial列是一个标识列,并且您正在使用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,否则无需进行任何更改。

我还没有检查上面的内容是否在Java EE 5中有效,原始JPA包含在EJB3中。如果需要在Java EE 5上支持JPA1,则可能需要进行更多检查。如果你必须支持Java EE 5,我建议从JSR 220 spec for JPA开始,但是你只需要移动到JPA2和Java EE 6容器就可以方式

请注意应该可以简单地使用GenerationType.IDENTITY并避免为每个实体手动定义序列。不幸的是,至少对于Hibernate,它假设你想为所有表使用全局的“休眠”序列,这只是愚蠢的。

allocationSize=1很重要。令人沮丧的是,JPA指定最小提取大小为50,并且当调用nextval()时,期望序列在跳转中增加50。除非您的序列以这种方式定义,否则您将获得重复的键错误。

您需要一个META-INF/persistence.xml文件才能启用JPA。访问实体是通过EntityManager获得的EntityMangerFactory,或者更常见的是使用@PersistenceContext注入实体。请参阅JPA文档和围绕'net。

的无尽教程

大多数应用程序服务器都附带JPA实现。 Glassfish 3发货,EclipesLink和JBoss AS 7发布Hibernate 4.请参阅应用服务器和JPA规范的文档。

答案 1 :(得分: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;
    }

...........

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