当设置了@GeneratedValue 时,实体管理器无法从 JSON 合并

Entity Manager fails on merging from JSON when @GeneratedValue is set

我目前正在开发一个保存歌曲的 Servlet。我在 JPA 中使用 hsqldb,我的问题是在初始化数据库时我必须从 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,所以不能删除它。

好的,我解决了问题。 Tomislav's answer helped me solving it.

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

正常保存它们
s.setId(null);
em.persist(s) //instead of em.merge(s)