我目前正在开发一个保存歌曲的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,所以删除它不是一个选项。
好的,我解决了问题。托米斯拉夫的回答帮我解决了这个问题。
问题是,在我的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)。例如: 有没有其他更好的方法来做到这一点。有什么设计模式可用吗?