2012-10-15 3 views
2

Je commence à utiliser JPA avec l'API OpenJPA, et j'ai un problème avec find(). Voici les tableaux:JPA find() ne charge pas Entité @Id

CREATE TABLE compania (
    ID int(11) NOT NULL, 
    NOMBRE varchar(45) DEFAULT NULL, 
    PRIMARY KEY (ID) 
) 

CREATE TABLE modelo (
    ID int(11) NOT NULL, 
    ID_COMPANIA int(11) DEFAULT NULL, 
    NOMBRE_MODELO varchar(45) DEFAULT NULL, 
    PRIMARY KEY (ID), 
    KEY MODELO_COMPANIA_FK_idx (ID_COMPANIA), 
    CONSTRAINT MODELO_COMPANIA_FK FOREIGN KEY (ID_COMPANIA) REFERENCES compania (ID) 
) 

et voici mes entités:

@Entity 
public class Compania extends EntityJPA{ 

    private static final long serialVersionUID = 1L; 

    @Id 
    private int id; 

    @Column 
    private String nombre; 

    @OneToMany(mappedBy="compania",cascade={CascadeType.ALL}) 
    @JoinColumn(name="ID_COMPANIA", nullable=false) 
    private List<Modelo> listaModelos; 

    public Compania() { 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int idCompania) { 
     this.id = idCompania; 
    } 

    public String getNombre() { 
     return nombre; 
    } 

    public void setNombre(String nombreCompania) { 
     this.nombre = nombreCompania; 
    } 

    public List<Modelo> getListaModelos() { 
     return listaModelos; 
    } 

    public void setListaModelos(List<Modelo> listaModelos) { 
     this.listaModelos = listaModelos; 
    } 
} 

@Entity 
public class Modelo extends EntityJPA{ 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    @Column(name="NOMBRE_MODELO") 
    private String nombreModelo; 

    @ManyToOne 
    @JoinColumn(name="ID_COMPANIA", referencedColumnName="ID") 
    private Compania compania; 

    public Modelo() { 
    } 

    public Compania getCompania() { 
     return compania; 
    } 

    public void setCompania(Compania compania) { 
     this.compania = compania; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int idModelo) { 
     this.id = idModelo; 
    } 

    public String getNombre() { 
     return nombreModelo; 
    } 

    public void setNombre(String nombreModelo) { 
     this.nombreModelo = nombreModelo; 
    } 
} 

Au moment je fais le

Compania cia = getEntityManager().find(Compania.class, idCompania); 

l'objet cia n'a pas la valeur du @ Id attribut, il a la valeur de nombre mais pas de id. Je veux dire:

cia.getId() = 0 

et il doit être 1 ou 2, etc. Non 0.

Merci beaucoup pour votre aide.

Je n'ai pas le code pour persister car il était déjà persistant. le code de la découverte est

public static Compania findCompania(int idCompania){ 
     try { 
      Compania cia = getEntityManager().find(Compania.class, idCompania); 
      return cia; 
     } finally { 
      closeEntityManager(); 
     } 
    } 

Et si le journal activer, c'est la sélection il montre:

482 testMySql TRACE [http-bio-8080-exec-5] openjpa.jdbc.SQL - <t 1228180882, conn 1699837157> executing prepstmnt 2127861376 SELECT t0.nombre FROM Compania t0 WHERE t0.id = ? [params=(int) 1] 
497 testMySql TRACE [http-bio-8080-exec-5] openjpa.jdbc.SQL - <t 1228180882, conn 1699837157> [15 ms] spent 

Comme vous pouvez le voir, il n'y a pas t0.id dans la sélection.

Merci pour votre aide.

+1

L'objet 'cia' aura la même valeur pour' id' que vous utiliserez dans find. Parce que les méthodes 'find' récupèrent un objet' Entity' de la base de données ayant la valeur spécifiée pour 'primary key'. Alors, quelle est la question? –

+0

La question est que cela n'arrive pas. Si je veux que l'objet cia ait la valeur id, je dois utiliser la méthode setId. Est-ce normal?? – Luislode

+0

@ utilisateur1748035. Non, ce n'est pas normal. Vous n'avez pas besoin de définir l'ID après l'avoir récupéré dans la base de données. Il y a un problème ailleurs. –

Répondre

0

Si vous ne définissez pas spécifiquement la valeur de l'attribut @Id, vous devez le déclarer avec @GeneratedValue afin qu'il soit automatiquement incrémenté.

+0

Je ne sais pas si c'est la même chose mais je n'ai pas besoin que l'attribut @Id soit automatiquement incrémenté. J'ai besoin qu'il prenne la même valeur que dans la base de données. Désolé si j'ai dit la même chose que vous avez dit mais je n'ai pas compris. – Luislode

+0

que se passe-t-il lorsque vous essayez de le sélectionner vous-même? 'getEntityManager(). CreateQuery (" CHOISIR c FROM Compania c WHERE c.id =? ")', Puis définir le paramètre pour la requête et obtenir les résultats. Est-ce qu'il revient toujours sans l'id? –