2017-06-21 47 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