如何使用串口和bigSerial与ejb3和PostgreSQL?
答案 0 :(得分:2)
假设当您说EJB3时,您打算使用Java Persistence API (JPA)作为Java EE 5中EJB3规范的一部分,并在Java EE 6中分离为JPA 2:
使用Integer
或Long
,常用的@Column
注释以及带有@GeneratedValue
的@SequenceGenerator
注释进行映射。
假设您的serial
或bigserial
列是一个标识列,并且您正在使用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;
}
...........