RESOLU [TP12] message "has two @GeneratedValues:

Modérateurs : graffion, jmdouin, agoncal, mlebihan

davidcha
Messages : 12
Inscription : 05 oct. 2015 19:53

RESOLU [TP12] message "has two @GeneratedValues:

Message par davidcha » 18 janv. 2016 23:49

Bonjour,
j'ai le message exception: "Class [.....Product] has two @GeneratedValues: for fields [T_PRODUCT.id] and [id]. Only one is allowed.
Ce message apparait dans la console glassfish au déploiement et lor du lancement de yaps-test dans les junit.
Extrait classe Product:

Code : Tout sélectionner

@Entity
@NamedQueries( {
@NamedQuery(name = "Product.findAll", query="select p from Product p"),
@NamedQuery(name = "Product.findAllInCategory", query="select p from Product p where p._category._id = :categoryId")
})
@Table(name = "T_PRODUCT")
public final class Product extends DomainObject implements Serializable {

    // ======================================
    // =             Attributes             =
    // ======================================
	@Id
    @Column(name = "id", length = 10)
    @TableGenerator(name="TABLE_GEN_PRODUCT", table="T_COUNTER", pkColumnName="name",
        valueColumnName="value", pkColumnValue="Product")
    @GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN_PRODUCT")
	private String _id;
	 @Column(name = "name", nullable = false, length = 50)
    private String _name;
	 @Column(name = "description", nullable = false, length = 255)
    private String _description;
	 @ManyToOne
	 @JoinColumn(name="category_fk")
    private Category _category;
	 
    @OneToMany(mappedBy="_product")
    private Collection<Item> _items;
Extrait classe Item:

Code : Tout sélectionner

@Entity
@NamedQueries( {
@NamedQuery(name = "Item.findAll", query="select i from Item i"),
@NamedQuery(name = "Item.findAllInProduct", query="select i from Product i where i._product._id = :productId"),
@NamedQuery(name = "Item.search", query="select i from Item i where (i._id LIKE '%:keyword%') OR (id._name like '%:keyword%'")
})
@Table(name = "T_ITEM")
public final class Item extends DomainObject implements Serializable {

    // ======================================
    // =             Attributes             =
    // ======================================
	@Id
    @Column(name = "id", length = 10)
    @TableGenerator(name="TABLE_GEN_ITEM", table="T_COUNTER", pkColumnName="name",
        valueColumnName="value", pkColumnValue="Item")
    @GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN_ITEM")
	private String _id;
	 @Column(name = "name", nullable = false, length = 50)
    private String _name;
	 @Column(name = "unitCost")
    private double _unitCost;
	 @Column(name = "imagePath", nullable = true, length = 255)
    private String _imagePath;
    @ManyToOne
    @JoinColumn(name="product_fk")
    private Product _product;
Extrait Category

Code : Tout sélectionner

@Embeddable
public final class Category extends DomainObject  implements Serializable {
	
    // ======================================
    // =             Attributes             =
    // ======================================
    @Id
    @Column(name = "id", length = 10)
    @TableGenerator(name="TABLE_GEN_CATEGORY", table="T_COUNTER", pkColumnName="name",
        valueColumnName="value", pkColumnValue="Category")
    @GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN_CATEGORY")
    private String _id;

    @Column(name = "name", nullable = false, length = 50)
    private String _name;
    @Column(name = "description", nullable = false, length = 255)
    private String _description;
    @OneToMany(mappedBy="_category")
    private Collection<Product> _products;

Cordialement.
Dernière édition par davidcha le 21 janv. 2016 15:52, édité 1 fois.

graffion
Messages : 611
Inscription : 21 juin 2005 14:05

Re: [TP12] message "has two @GeneratedValues: for fields ...

Message par graffion » 20 janv. 2016 16:52

Bonjour,

Il y a sans doute un problème avec cette ligne

Code : Tout sélectionner

@Embeddable
public final class Category extends DomainObject  implements Serializable {
Une des contraintes que l'on s'est imposée pour le TP JPA est d'utiliser les mêmes tables en BD que précédemment.

La classe Address est donc annotée par @Embeddable car ses instances peuvent être @Embedded dans certaines tables.

C'est le cas pour la table T_ORDER :

Code : Tout sélectionner

CREATE TABLE T_ORDER( 
id VARCHAR(10), PRIMARY KEY(id), 
orderdate TIMESTAMP NOT NULL, firstname VARCHAR(50) NOT NULL, lastname VARCHAR(50) NOT NULL, 
// @Embedded
street1 VARCHAR(50) NOT NULL, street2 varchar(50), city VARCHAR(25) NOT NULL, state VARCHAR(25), zipcode VARCHAR(10) NOT NULL, country VARCHAR(25) NOT NULL, 
//...
qui est accessible par l'entité Order :

Code : Tout sélectionner

@Table(name = "T_ORDER")
public class Order extends DomainObject implements Serializable {
    // ...
    @Embedded
    private final Address _address = new Address();

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité