当设置了@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)
我目前正在开发一个保存歌曲的 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)