如何按顺序插入多行

时间:2016-09-28 10:43:30

标签: java hibernate

我正在学习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
}

}

2 个答案:

答案 0 :(得分:2)

第一次参加

    testAuthor.setmFName("Ali");
    testAuthor.setmLName("gamil");
    HibernateUtil.getCurrentSession().persist(testAuthor);

它在DB中创建新行(作为其瞬态对象,No id分配给TestAuthor)并将id分配给testAuthor,对象变为持久性。之后,如果你重复它,它只是更新同一行

如果要插入另一行,请创建另一个瞬态对象

    testAuthor = new TestAuthor();

请参阅Object states in Hibernate

答案 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才会为插入准备数据)