質問

NetBeans IDE 6.7.1 ガラスフィッシュv2.1、 Oracle 10g XE、 Java 6 SE、 Java 5 EE、

ステートレスEJBの内側から、私は注釈を持っているタイプの顧客のエンティティを持続します: クラス顧客の@sequencegenerator(name="seq"、sequenceName="cust_id_seq") 主キーはシーケンスCUST_ID_SEQからデータベースで自動生成されますが、最初の顧客が10000ではなく9951である場合、2番目の顧客の主キーは9952です.2つの顧客を持続させた後のGlassFish v2.1の出力

です

アプリケーションサーバの起動完了。

私のIDは:0

TopLink、バージョン:Oracle TopLink Essentials - 2.1(Build B31G-FCS(10/19/2009))

サーバ:不明 ファイル:/ c:/文書%20and%20settings / Ioannis_Papaioannou / My%20Documents / NetBeansProjects / VideoClub / 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
.

/

yiannis p.

役に立ちましたか?

解決 2

annotation @SequenceGeneratorでは、atribute allocationsizeを値1で追加しました。これで主キーは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 BY 1 ... INCREMENT BY 50 に変更する必要があると思います。これがその理由です。

宣言されているシーケンス増分は、@SequenceGeneratorallocationSizeパラメータと一致する必要があります。 allocationSizeは指定されていないため、デフォルトは50です。ただし、True INCREMENT BYは50ではなく1だけです。

これはこの不一致が問題を引き起こす可能性があるものです。 TopLink Essentials(TLE)はallocationSizeINCREMENT BYを呼び出します。シーケンスは10000 + 1を返します.TLEは、1(実際の量)ではなく50(デフォルトのJPA NEXTVAL())だけインクリメントされたシーケンスを仮定します。 TLEは10001からcust_id_seq= 50を減算して9951を取得します。

ところで、あなたがそれをする自由を持っているならば、TLEの後継者へのアップグレード、 eclipseLink GlassFish v3 )。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top