2016-09-28 50 views
0

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

不要重复使用同一个对象来表示不同的数据行。为每一行创建一个新的TestAuthor。 – JonK

回答

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>; 

此外,坚持只适用于新的对象,这意味着如果您尝试插入相同的对象/实体两次,你会得到一个异常。

刷新和清除会话的目的与释放与其关联的内存,并让Hibernate在处理其他记录之前将50行(批量大小)正好插入数据库中。 因为我们使用的是事务控制,所以在调用事务对象的提交之前,不会(永久)保存/保留实际行(flush会准备插入数据)

+0

是的,SO是因为有愚蠢的人而不知道为什么downvote而闻名。 –

+0

你会告诉我,是.flush和。清除与HibernateUtil.getCurrentSession()不同。persist? – user2121

+0

persist()与save()类似,与flush()和clear()无关。 –

2

一旦你做第一次

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

它在数据库中创建新行(作为其临时对象,将No id分配给TestAuthor)并将id分配给testAuthor,并且对象变为持久性。在此之后,如果你再说一遍,如果你想插入另一行创建另一个临时对象

testAuthor = new TestAuthor(); 

Object states in Hibernate

+0

好..没有标识,因为id是aprimark键添加为约束,其值通过序列增加 – user2121

+0

您可以发布类TestAuthor –

+0

张贴在我的更新部分 – user2121