2017-06-21 50 views
0

我已經使用JPA構建了我的數據模型,並使用Hibernate的EntityManager訪問數據。我正在爲其他類使用此配置,並沒有任何問題。Spring/JPA:複合鍵查找返回空元素[{}]

問題是我創建了一個具有複合主鍵(兩個鍵是外鍵)的實體,添加元素的工作非常完美我在數據庫中檢查了它,但我無法從數據庫檢索填充的行。例如,如果我查詢「FROM referentiel」以返回表中所有參數列表,我得到這個list.size()具有適當數量的元素(2),但元素爲空。

實體:

@Entity 
@Table(name = "Et_referentiel") 
public class Referentiel implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "id_projet") 
    private Projet projet; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "id_ressource") 
    private Ressource ressource; 


    @Column(name = "unite", nullable = false) 
    private String unite; 

}

這裏是我的控制器的GetList方法:

@PostMapping(value = "/list", consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE }) 
    public List<Referentiel> listReferentiel(@RequestBody Long idProjet) { 

     List<Referentiel> referentiel = referentielService.listReferentiel(idProjet); 
     return referentiel; 
    } 

,這裏是我的DAO方法:

@Autowired 
    private EntityManager em; 

    @Override 
    public void ajouterReferentiel(Referentiel ref) { 
     em.persist(ref); 
     em.flush(); 

    } 
    @SuppressWarnings("unchecked") 
    @Override 
    public List<Referentiel> listReferentiel(Long idProjet) { 

     Query query = em.createQuery("Select r from Referentiel r where r.projet.idProjet=:arg1"); 
     query.setParameter("arg1", idProjet); 
     em.flush();  
     List<Referentiel> resultList = query.getResultList(); 
     return resultList; 
    } 

任何幫助不勝感激。

+0

你有你的項目中的json jar或依賴項嗎?你是否將json轉換器加入了spring?你能告訴你如何配置你的控制器嗎? – xyz

+0

我的項目總是完美的工作,我只有當我使用複合鍵時,這個問題,這不是一個配置問題 – SuperGirl

+0

是Projet也Serializable? – xyz

回答

1

嘗試建立代表您的複合鍵的一類:

public class ReferentielId implements Serializable { 

    private static final long serialVersionUID = 0L; 

    private Long projet; // Same type than idProjet, same name than inside Referentiel 
    private Long ressource; // Same type than idRessource (I guess), same name than inside Referentiel 

    // Constructors, getters, setters... 
} 

並將其分配給具有複合鍵的實體。

@Entity 
@IdClass(ReferentielId.class) // <- here 
@Table(name = "Et_referentiel") 
public class Referentiel implements Serializable { 

    // ... 
} 

請注意,它需要有一個類表示組合鍵,即使這對您的問題沒有幫助。

+0

添加類時我有這個錯誤,同時增加:「分離的實體傳遞給persist:solubat.entity.etudeDeDossier.Projet; – SuperGirl

+0

@SuperGirl你配置了'@ManyToOne(cascade = ...)'級聯' etudeDeDossier.Projet'嘗試'@ManyToOne(cascade = CascadeType.MERGE)'代替 – kagmole

+0

仍然有同樣的錯誤detached entity to persist: – SuperGirl