2010-10-27 67 views
6

我是新的Hibernate.when我保存特定的實體,然後它重寫現有的數據。HIbernate覆蓋數據時持久/保存實體

我已經使用ID爲自動生成如下:

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="id") 
private int id; 

這裏我實體保存如下:

class StudDAO() { 

public static void main(String[] args){ 
    StudDAO obj = new StudDAO(); 
    Stud stud = new Stud(); 
    stud.setName("Test"); 
    stud.setCity("Mumbai"); 
    obj.createStud(stud); 
} 

public void createStud(Stud stud) { 
    try { 

    Session session = HibernateSessionFactory.getSessionFactory().openSession(); 
    Transaction transaction = session.beginTransaction(); 
    session.save(stud); 
    transaction.commit(); 

    } catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
     transaction.rollback(); 
    } 
} 

}

如果我將改變實體值下一次則應該生成下一個ID,而不是從第一個ID開始。

任何時候結果會是同樣喜歡

mysql> select * from stud; 

+----+--------+------+ 
| id | city | name | 
+----+--------+------+ 
| 1 | Mumbai | Test | 
+----+--------+------+ 

1行中集(0.00秒)

我想是在結果如下圖所示:

mysql> select * from stud; 
+----+--------+------+ 
| id | city | name | 
+----+--------+------+ 
| 1 | Mumbai | Test | 
| 2 | Mumbai | Test | 
+----+--------+------+ 
2 rows in set (0.00 sec) 

請幫我相同..

回答

13

我意識到這是一年前問的,但我有和你一樣的問題,我想我會發布它,以防其他人擁有它。

原來,這是在我的會話工廠設置:

查找設定hibernate.hbm2ddl.auto,則很可能有它設置爲創建。當您的會話工廠創建時,此設置會執行某些操作。 創建的確實是刪除了現有的模式(至少是它將使用的表)並創建一個新的模式,使其看起來像覆蓋了表中的行。

您可以從這裏選擇幾種不同的值。對於開發,我相信你會想要它設置更新,因爲它會爲你創建新的表,如果它們不存在(就像創建),但如果表已經存在,它將更新模式。

對於生產,你應該堅持驗證,因爲它不會改變你的模式,只是驗證吧:)

對於不同值的更多詳情,請this excellent answer

+0

謝謝。這有幫助。 – 2012-05-21 06:42:07

+0

感謝! – dade 2014-08-28 12:15:01

2

如果您想要執行更新,而不是每次向數據庫添加新行ñ您需要檢索所需的實體,進行所需的更新,然後再次保存該實體。

1

使用saveOrUpdate(..)

注意,JPA(休眠)實體是由他們的@Id鑑定嘗試。如果您的對象與db中的對象具有相同的id,則會發生更新。否則,邏輯上,插入會發生。

+0

從他的例子看來,他正在運行一個命令行示例,並期望後續執行不會向數據庫添加新條目。 – 2010-10-27 14:05:34

+0

是的,這是真的..但有沒有其他方式呢?如果我插入不同的實體值,那麼它只是從現有的數據重寫數據,而不是創建新的記錄..如果我的表的最大id是2,那麼下一個插入的數據應該在第3個。但它只是從第1個開始。 – Sweety 2010-10-28 05:36:09

0

在創建的數據庫表中添加一行可能有幫助

`id` INT(11) NOT NULL AUTO_INCREMENT 

當您向表中添加一行時,AUTO_INCREMENT將增加id計數。