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.
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? –
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
@ 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. –