我正在学习hibernate,我有一个hibernate类TestAuthor,我正在使用'HibernateUtil.getCurrentSession()。persist'命令将记录插入到该类中,如下面的代码所示。 问题是,当我运行该代码然后检查表中的条目时,我发现onlx插入了最后一条记录。换句话说,运行下面的代码后,表TestAuthor只包含插入的最后一条记录 这是'testAuthor.setmFName(“Nour”); testAuthor.setmLName( “Youssri”);'
为什么只插入最后一行而忽略另一行,以及如何解决这个问题?
hibernate代码:
TestAuthor testAuthor = new TestAuthor();
testAuthor.setmFName("Ali");
testAuthor.setmLName("gamil");
HibernateUtil.getCurrentSession().persist(testAuthor);
testAuthor.setmFName("Fatma");
testAuthor.setmLName("Joss");
HibernateUtil.getCurrentSession().persist(testAuthor);
testAuthor.setmFName("Lobna");
testAuthor.setmLName("Nolan");
HibernateUtil.getCurrentSession().persist(testAuthor);
testAuthor.setmFName("Ahmed");
testAuthor.setmLName("Ghadi");
HibernateUtil.getCurrentSession().persist(testAuthor);
testAuthor.setmFName("Nour");
testAuthor.setmLName("Youssri");
HibernateUtil.getCurrentSession().persist(testAuthor);
更新
TestAuthor :
@Entity
@Table(schema = "afk_owner", name = "testauthor")
public class TestAuthor {
@Id
@Column(name = "authorid")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator =
"sequencegen")
@SequenceGenerator(name = "sequencegen", sequenceName =
"afk_owner.testauthor_seq", allocationSize = 1)
private Integer mAuthorID;
@Column(name = "FNAME")
private String mFName;
@Column(name = "LNAME")
private String mLName;
@OneToMany(mappedBy = "author")
private List<TestBook> books;
public Integer getmAuthorID() {
return mAuthorID;
}
public void setmAuthorID(Integer mAuthorID) {
this.mAuthorID = mAuthorID;
}
public String getmFName() {
return mFName;
}
public void setmFName(String mFName) {
this.mFName = mFName;
}
public String getmLName() {
return mLName;
}
public void setmLName(String mLName) {
this.mLName = mLName;
}
public TestAuthor() {
// TODO Auto-generated constructor stub
}
}
答案 0 :(得分:2)
第一次参加
testAuthor.setmFName("Ali");
testAuthor.setmLName("gamil");
HibernateUtil.getCurrentSession().persist(testAuthor);
它在DB中创建新行(作为其瞬态对象,No id分配给TestAuthor)并将id分配给testAuthor,对象变为持久性。之后,如果你重复它,它只是更新同一行
如果要插入另一行,请创建另一个瞬态对象
testAuthor = new TestAuthor();
答案 1 :(得分:0)
如果您有很多对象,我建议您进行批量插入
List<TestAuthor> listTA = new ArrayList<>();
//create TestAuthor objects and add them to listTA
Session session = HibernateUtil.getCurrentSession();
Transaction trx = session.beginTransaction();
int i = 0;
for( TestAuthor ta : listTA){
session.persist(ta);
//or session.save(ta);
i++;
if (i % 50 == 0) {
session.flush();
session.clear();
}
}
trx.commit();
session.close();
您的hibernate配置文件还应包含
<property name="hibernate.jdbc.batch_size">50</property>;
此外,persist仅适用于新对象,这意味着如果尝试两次插入相同的对象/实体,则会出现异常。
刷新和清除会话的目的与释放与其关联的内存并让Hibernate在处理其他记录之前将50行(批量大小)插入数据库中有关。 因为我们正在使用事务控制,所以实际的行不会(永久)保存/持久化,直到调用事务对象的提交(flush才会为插入准备数据)