تبدأ المفاتيح الأساسية التي تم إنشاؤها من النموذج 9951 بدلاً من 10000

StackOverflow https://stackoverflow.com/questions/3283224

سؤال

أستخدم:

NetBeans IDE 6.7.1 ، Glassfish v2.1 ، Oracle 10G XE ، Java 6 SE ، Java 5 EE ،

من داخل EJB عديم الحالة، أستمر في كيانات من نوع العميل ولدي التعليق التوضيحي:elesenceGenerator (name = "seq" ، sequencename = "cust_id_seq") في عميل الفئة ، بحيث يتم تجنيد المفاتيح الأساسية في قاعدة البيانات من تسلسل cust_id_seq ولكن عندما أستمر في العميل الأول ، يكون المفتاح الأساسي هو 9951 بدلاً من 10000 مفتاح العميل الثاني هو 9952.إخراج GlassFish v2.1 بعد أن أصررت على عميلين هو:

اكتمل بدء تشغيل خادم التطبيق.

هويتي هي:0

توب لينك، الإصدار:أساسيات Oracle TopLink - 2.1 (الإصدار b31g-fcs (19/10/2009))

الخادم:ملف غير معروف:/c:/documents ٪ 20 و ٪ 20settings/ioannis_papaioannou

هويتي هي:9951

هويتي هي:0

هويتي هي: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

/

يانيس ب.

هل كانت مفيدة؟

المحلول 2

في كيان العميل في الشرح Reviewnernerator، أضفت تخصيص ATRIBETION مع القيمة 1، والآن تبدأ المفاتيح الأساسية من 10000.

giveacodicetagpre.

نصائح أخرى

أعتقد أنك يجب أن تتغير 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، إكليبس لينك (و ل السمكة الزجاجية v3).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top