我利用:

Netbeans IDE 6.7.1,Glassfish v2.1,Oracle 10g Xe,Java 6 SE,Java 5 EE,

从无状态 EJB 内部,我保留了 customer 类型的实体,我有注释:@SequenceGenerator(name =“ seq”,sequenceName =“ cust_id_seq”)在类客户中,因此从sequence cust_id_seq在数据库中自动化了主要键第二个客户的关键是9952。我坚持两个客户后,GlassFish v2.1 的输出是:

应用服务器启动完成。

我的 ID 是:0

顶部链接,版本:Oracle TopLink Essentials - 2.1(构建 b31g-fcs (10/19/2009))

服务器:未知文件:/c:/c./documents%20和%20settings/ioannis_papaioannou/我的%20documents/netbeansprojects/videoclub/dist/dist/gfdeploy/videoclub-ejb_jar/-vc_pu login成功

我的 ID 是:9951

我的 ID 是:0

我的 ID 是:9952

@Entity
@Table(name = "customer")
@SequenceGenerator(name="seq", sequenceName="cust_id_seq")
public class Customer implements Serializable
{

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
@Column(name="CUST_ID")
private int id;

@Column(name = "phone_number")
private int phoneNumber;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "credit")
private int credit;

@OneToMany    
private Collection<CustRentMovie> rents = new ArrayList<CustRentMovie>();

public int getCredit()
{
    return credit;
}

public void setCredit(int credit)
{
    this.credit = credit;
}

public String getFirstName()
{
    return firstName;
}

public void setFirstName(String firstName)
{
    this.firstName = firstName;
}

public int getId()
{
    return id;
}

public void setId(int id)
{
    this.id = id;
}

public String getLastName()
{
    return lastName;
}

public void setLastName(String lastName)
{
    this.lastName = lastName;
}

public int getPhoneNumber()
{
    return phoneNumber;
}

public void setPhoneNumber(int phoneNumber)
{
    this.phoneNumber = phoneNumber;
}

public Collection<CustRentMovie> getRents()
{
    return rents;
}

public void setRents(Collection<CustRentMovie> rents)
{
    this.rents = rents;
}


}

EJB的代码:

@Stateless
public class ClerkSessionBean implements ClerkSessionRemote
{

@PersistenceContext(unitName = "vc_pu")
private EntityManager em;

public int writeCustomer(AlmostCustomer almostCustomer)
{

    Customer customer = new Customer();
    System.out.println("My id is: " + customer.getId());
    customer.setFirstName(almostCustomer.getFirstName());
    customer.setLastName(almostCustomer.getLastName());
    customer.setPhoneNumber(almostCustomer.getPhoneNumber());
    em.persist(customer);
    System.out.println("My id is: " + customer.getId());
    return customer.getId();
}
}

创建数据库的脚本部分:

CREATE table customer
(
cust_id NUMBER(5),
phone_number NUMBER(10) NOT NULL,
first_name VARCHAR2(12) NOT NULL,
last_name VARCHAR2(30) NOT NULL,
-- Τα χρήματα που έχει ένας πελάτης στο λογαριασμό του.
credit NUMBER(5, 2) DEFAULT 0 NOT NULL,
CONSTRAINT cust_pk PRIMARY KEY (cust_id),
-- Μόνο ένας λογαριασμός για κάθε σπίτι.
CONSTRAINT phone_unique UNIQUE (phone_number)
)
/

DROP SEQUENCE cust_id_seq
/

CREATE SEQUENCE cust_id_seq MINVALUE 10000 MAXVALUE 99999 INCREMENT BY 1 START WITH 10000 NOCACHE  NOCYCLE ORDER

/

雅尼斯·P.

有帮助吗?

解决方案 2

在注释中的客户实体中,@SequenceGenerator我添加了与值1的Atribute分配,现在主键从10000开始。

@Entity
@Table(name = "customer")
@SequenceGenerator(name="seq", sequenceName="cust_id_seq", allocationSize=1)
public class Customer implements Serializable
{

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
    @Column(name="CUST_ID")
    private int id;  
...
}
.

其他提示

我认为你应该改变 CREATE SEQUENCE cust_id_seq ... INCREMENT BY1... INCREMENT BY50. 。这就是原因。

声明的序列增量应该匹配 @SequenceGeneratorallocationSize 范围。 allocationSize 未指定,因此默认为 50。但真实的 INCREMENT BY 只有 1,而不是 50。所以之间存在不匹配 allocationSize 和真实的 INCREMENT BY.

以下是这种不匹配可能导致问题的原因。TopLink Essentials (TLE) 调用 NEXTVAL()cust_id_seq. 。该序列返回 10000 + 1。TLE 假设序列仅增加 50(默认 JPA allocationSize) 而不是 1(实际金额)。TLE 减法 allocationSize = 50 从 10001 得到 9951。

顺便说一句,如果您有自由这样做,请考虑升级到 TLE 的后继者, EclipseLink (并 玻璃鱼 v3).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top