2016-09-28 24 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