Frage

Ich benutze:

NetBeans IDE 6.7.1, GlassFish v2.1, Orakel 10g XE, JAVA 6SE, JAVA 5 EE,

In einem zustandslosen EJB behalte ich Entitäten vom Typ Kunde bei Ich habe die Anmerkung:@SequenceGenerator(name="seq", sequenceName="cust_id_seq") in der Klasse Kunde, so dass die primärschlüssel werden in der Datenbank automatisch aus der Sequenz cust_id_seq generiert, aber wenn ich den ersten Kunden behalte, ist der Primärschlüssel 9951 anstelle von 10000, der Primärschlüssel des zweiten Kunden ist 9952.Die Ausgabe des GlassFish v2.1, nachdem ich zwei Kunden beharrte, ist:

Start des Anwendungsservers abgeschlossen.

Meine ID ist:0

Seitenanfang, Version:Oracle TopLink Essentials - 2.1 (Erstellen Sie b31g-fcs (19.10.2009))

Server:unbekannt file:/C:/Documents%20and%20Settings/IOANNIS_PAPAIOANNOU/My%20Documents/NetBeansProjects/VideoClub/dist/gfdeploy/VideoClub-ejb_jar/- vc_pu Anmeldung erfolgreich

Meine ID ist:9951

Meine ID ist:0

Meine ID ist: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;
}


}

der Kodex des 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();
}
}

teil des Skripts, das die Datenbank erstellt:

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.

War es hilfreich?

Lösung 2

In der Kundeneinheit in der Annotation @ sequencegenerator habe ich die atribute-Zuteilung mit Wert 1 hinzugefügt, jetzt beginnen die primären Tasten von 10000.

generasacodicetagpre.

Andere Tipps

Ich denke, du solltest dich ändern CREATE SEQUENCE cust_id_seq ... INCREMENT BY1 zu ... INCREMENT BY50.Hier ist der Grund.

Das deklarierte Sequenzinkrement sollte mit dem übereinstimmen @SequenceGeneratorvon allocationSize Parameter. allocationSize ist nicht angegeben und daher standardmäßig 50.Aber das wahre INCREMENT BY ist nur 1, nicht 50.Es besteht also ein Missverhältnis zwischen allocationSize und das echte INCREMENT BY.

Hier ist, wie diese Nichtübereinstimmung das Problem verursachen könnte.TopLink Essentials (TLE) Aufrufe NEXTVAL() auf cust_id_seq.Die Sequenz gibt 10000 + 1 zurück.TLE nimmt die gerade um 50 inkrementierte Sequenz an (Standard-JPA allocationSize) anstelle von 1 (tatsächlicher Betrag).TLE subtrahiert allocationSize = 50 von 10001, um 9951 zu erhalten.

Übrigens, wenn Sie die Freiheit dazu haben, sollten Sie ein Upgrade auf den Nachfolger von TLE in Betracht ziehen, EclipseLink (und zu Glassfish v3).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top