这是我在阅读了几个关于jpa批量插入的主题后创建的简单示例,我有2个持久对象User和Site.一个用户可以有很多站点,所以我们在这里有一对多的关系.假设我想创建用户并创建/链接几个站点到用户帐户.考虑到我愿意为Site对象使用批量插入,这是代码的样子.
User user = new User("John Doe");
user.getSites().add(new Site("google.com", user));
user.getSites().add(new Site("yahoo.com", user));
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码(我使用hibernate作为jpa实现提供程序)时,我看到以下sql输出:
Hibernate: insert into User (id, name) values (null, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Run Code Online (Sandbox Code Playgroud)
所以,我的意思是"真正的"批量插入不起作用或我感到困惑?
以下是此示例项目的源代码,这是maven项目,因此您只需下载并运行mvn install来检查输出.
更新:
在Ken Liu亲切地建议之后,我已禁用Site对象id自动生成:
User user = new User("John Doe");
user.getSites().add(new Site(1, "google.com", user));
user.getSites().add(new …Run Code Online (Sandbox Code Playgroud) 我有一个学生实体.我的想法是在ArrayList中收集多个学生对象,并将该列表中的所有对象保存到数据库中.什么时候使用@ElementCollection注释?它适用于这种情况吗?
学生:
package basic;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public Student() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + …Run Code Online (Sandbox Code Playgroud)