Question

J'ai utiliser:

NetBeans IDE 6.7.1, GlassFish v2.1, Oracle 10g XE, LA VERSION 6 DE JAVA SE, JAVA EE 5,

À partir de l'intérieur d'un EJB stateless je persiste entités de type client j'ai l'annotation:@SequenceGenerator(name="seq", sequenceName="cust_id_seq") dans la classe client de sorte que le les clés primaires sont générés automatiquement dans la base de données à partir de la séquence cust_id_seq mais lorsque je persiste le premier client de la clé primaire est 9951, au lieu de 10000, la clé primaire de la deuxième client est 9952.La sortie de la GlassFish v2.1 après j'ai persisté deux clients est:

Démarrage du serveur d'applications complète.

Mon id est:0

TopLink, version:Oracle TopLink Essentials - 2.1 (Build b31g-fcs (10/19/2009))

Serveur:inconnu file:/C:/Documents%20and%20Settings/IOANNIS_PAPAIOANNOU/My%20Documents/NetBeansProjects/VideoClub/dist/gfdeploy/VideoClub-ejb_jar/-vc_pu connexion réussie

Mon id est:9951

Mon id est:0

Mon id est: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;
}


}

le code de l'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();
}
}

la partie du script qui crée la base de données:

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.

Était-ce utile?

La solution 2

Dans l'entité du client dans l'annotation @SEFENCEGENERATOR, j'ai ajouté l'allocations Atribute à la valeur 1, les touches principales commencent à 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;  
...
}

Autres conseils

Je pense que vous devriez changer CREATE SEQUENCE cust_id_seq ... INCREMENT BY1 pour ... INCREMENT BY50.Voici pourquoi.

La déclaration de séquence incrément doit correspondre à la @SequenceGenerator's allocationSize le paramètre. allocationSize n'est pas spécifié et donc la valeur par défaut est 50.Mais le vrai INCREMENT BY n'est que de 1, pas 50.Il y a donc un décalage entre allocationSize et le réel INCREMENT BY.

Voici comment remédier à ce problème, pourrait provoquer le problème.TopLink Essentials (TLE) appels NEXTVAL() sur cust_id_seq.La séquence renvoie 10000 + 1.TLE suppose la séquence incrémenté par 50 (par défaut JPA allocationSize) au lieu de 1 (montant réel).TLE soustrait allocationSize = De 50 à partir de 10001 à obtenir 9951.

Par ailleurs, si vous avez la liberté de le faire, envisager de passer à la TLE successeur, EclipseLink (et pour Glassfish v3).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top