当前位置: 首页 > 知识库问答 >
问题:

设置@GeneratedValue时,实体管理器从JSON合并失败

魏康安
2023-03-14

我目前正在开发一个保存歌曲的Servlet。我将hsqldb与JPA一起使用,而我的问题是,在初始化DB时,我必须从一个JSON文件中加载10首歌曲。但只要我在我的歌曲实体中使用@GeneratedValue,它就只能加载10首歌曲中的5首。

下面是我访问JSON文件的代码。

 @Override
public void init() {
    emf = Persistence.createEntityManagerFactory("NewPersistenceUnit");

    // Problem with loading just half the json
    loadSongsFromJSON("songs.json");
    System.out.println("DB initialized");
}

private void loadSongsFromJSON(String filename) {
    List<Song> songsFromJSON = null;
    EntityManager em = null;
    try {
        ObjectMapper objectMapper = new ObjectMapper();
        InputStream is = getClass().getClassLoader().getResourceAsStream(filename);
        songsFromJSON = objectMapper.readValue(is, new TypeReference<List<Song>>() {
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (songsFromJSON != null) {

        //for testing
        System.out.println("ALL SONGS IN INIT" + System.lineSeparator());

        for (Song s : songsFromJSON) {
            em = emf.createEntityManager();
            em.getTransaction().begin();
            //em.persist(s);
            em.merge(s);

            //for testing
            System.out.println("ADDED " + s);

            em.getTransaction().commit();
            em.close();
        }
    }
}

所有10首歌都在榜单中,原因是:

System.out.println("ADDED " + s);

都打印出来了。

我还需要使用@GeneratedValue,所以删除它不是一个选项。

共有1个答案

居京
2023-03-14

好的,我解决了问题。托米斯拉夫的回答帮我解决了这个问题。

问题是,在我的JSON中,歌曲有一个设置的ID。因此我将所有ID设置为null,然后使用

em.persist(s) //instead of em.merge(s)
 类似资料:
  • 有什么能帮上忙的吗?有人能解释一下为什么没有对对象进行更改时行不更新吗?:)谢谢!

  • 我有一个通用的JPA存储库实现,处理以下多种类型的实体: 在某个时候,我意识到一些实体还没有被删除。然后,我发现一些实体导致删除的取消,如下所述:https://stackoverflow.com/a/16901857/502059 由于该方法是通用的,因此它包含各种类型的实体。作为一种解决方法,我想摆脱导致取消删除的实体,并在 方法的开头添加了 虽然这有效,但我觉得这是一个肮脏的解决方法。 所以

  • 问题内容: 下面给出从到的一对多关系。 部门(家长): 员工(孩子): 合并如下所示的托管实体(子实体)(在EJB中使用CMT), 不会更新数据库表中的相应员工行。仅当从中的子关系中删除时,才会发生这种情况。 为什么表中的行没有更新?关于此示例的唯一目的是什么? 我当前正在使用具有JPA 2.1的EclipseLink 2.6.0。 问题答案: 级联应该始终从父级传播到子级,而不是相反。 在您的情

  • 我试图使用spring boot将EntityManager注释注入到我的DAO中,但是得到一个< code > InvalidDataAccessApiUsageException 消息,说没有可用的事务EntityManager。我的印象是,只要Spring Boot从< code>application.yml中获得了我的数据源信息,并且我用< code>@PersitenceContext

  • http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“> 但面对这个例外: 任何帮助都将不胜感激...

  • 我正在使用JPA Spring开发Web应用程序。我的项目层结构是web- 我的应用程序在 http 会话中获取存储的域实体。在我对实体执行任何数据库操作之前,需要使用 merge 将其重新附加到实体管理器。我想知道将实体合并到实体管理器的最佳方法。目前每次调用事务方法时,我都会调用 genericDAO.merge(object)。例如: 有没有其他更好的方法来做到这一点。有什么设计模式可用吗?