2012-10-15 41 views
2

我開始在OpenJPA API中使用JPA,並且我遇到了find()問題。 下面是表:JPA find()不加載實體@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) 
) 

,這裏是我的實體:

@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; 
    } 
} 

此刻,我讓

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

中情局對象不具有的價值@ Id屬性,它具有nombre但不是id的值。我的意思是:

cia.getId() = 0 

,它必須是1或2,等不爲0

非常感謝您的幫助。

我沒有代碼來堅持,因爲它已經存在。 對於發現的代碼是

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

如果我激活日誌,這是選擇它表明:

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 

正如你所看到的,有在選擇沒有t0.id。

感謝您的幫助。

+1

'cia'對象對於您在find中使用的'id'具有相同的值。因爲'find'方法從數據庫中獲取具有'primary key'指定值的'Entity'對象。那麼,這有什麼問題? –

+0

問題是沒有發生。如果我想要cia對象有id值,我必須使用setId方法。這是正常的嗎? – Luislode

+0

@ user1748035。不,這不正常。從數據庫中獲取後,您不必設置該ID。其他地方有問題.. –

回答

0

如果您沒有專門設置@Id屬性的值,則必須用@GeneratedValue來聲明它,以便它自動遞增。

+0

我不知道是否是相同的東西,但我不需要@Id attibute自動遞增。我需要它與數據庫中的值相同。對不起,如果我說的話和你說的一樣,但我不明白。 – Luislode

+0

當你嘗試自己選擇它時會發生什麼? 'getEntityManager()。createQuery(「SELECT c FROM Compania c WHERE c.id =?」)'然後設置查詢的參數並獲得結果。它是否還沒有ID? –