【问题标题】:Spring/JPA: composite Key find returns empty elements [{}]Spring/JPA:复合键查找返回空元素 [{}]
【发布时间】:2017-06-21 14:16:34
【问题描述】:

我已经使用 JPA 构建了我的数据模型,并且正在使用 Hibernate 的 EntityManager 来访问数据。我正在将此配置用于其他类并且没有问题。

问题是我创建了一个带有复合主键的实体(两个键是外键),添加元素效果很好我在数据库中检查了它,但我无法从数据库中检索填充的行。

例如,如果我查询“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;
    }

非常感谢任何帮助。

【问题讨论】:

  • 您的项目中是否有 json jar 或依赖项?你在spring中添加了json转换器吗?你能展示你是如何配置你的控制器的吗?
  • 我的项目总是完美运行,我只有在使用复合键时才会出现这个问题,这不是配置问题
  • Projet 也可以序列化吗?
  • 是的,它是可序列化的
  • 我没有看到交易,所以我会先检查您是否先提交了插入,然后再尝试查询它们。其次,JPA 在使用组合键时需要主键类或嵌入式 ID,而您的描述中没有。 pk 类将仅用于查找操作以保存标记为 ID 的两个引用中的值。

标签: spring postgresql hibernate jpa composite-key


【解决方案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 {

    // ...
}

请注意,需要有一个类来表示您的复合键,即使这对您的问题没有帮助。

【讨论】:

  • 添加类时我在添加时遇到此错误:“分离的实体传递给持久化:solubat.entity.etudeDeDossier.Projet;
  • @SuperGirl 你是否在etudeDeDossier.Projet@ManyToOne(cascade = ...) 上配置了级联?请改用@ManyToOne(cascade = CascadeType.MERGE)
  • 仍然有相同的错误分离实体传递给坚持:
  • 即使你把@ManyToOne(cascade = CascadeType.MERGE) for Projet放在Referentiel上?
  • 是的,我添加了它,但我仍然有第二个问题(分离)
猜你喜欢
  • 2011-03-07
  • 2016-03-08
  • 1970-01-01
  • 2017-12-08
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多