2010-04-05 177 views
2

我用Java中的Hibernate映射了一些類到一些表中,我設置Hibernate顯示SQL,它打開會話,它顯示它執行SQL,它關閉會話,但沒有修改數據庫。休眠不會保存到數據庫

實體

public class Profesor implements Comparable<Profesor> { 
private int id; 
private String nume; 
private String prenume; 
private int departament_id; 
private Set<Disciplina> listaDiscipline; //the teacher gives some courses} 

public class Disciplina implements Comparable<Disciplina>{ //the course class 

private int id; 
private String denumire; 
private String syllabus; 
private String schNotare; 
private Set<Lectie> lectii; 
private Set<Tema> listaTeme; 
private Set<Grup> listaGrupuri; // the course gets teached/assigmened to some groups of students 
private Set<Assignment> listAssignments;} 

映射

<hibernate-mapping default-cascade="all"> 
<class name="model.Profesor" table="devgar_scoala.profesori"> 
<id name="id" column="id"> 
<generator class="increment"/> 
</id> 
<set name="listaDiscipline" table="devgar_scoala.`profesori-discipline`"> 
<key column="Profesori_id" /> 
<many-to-many class="model.Disciplina" column="Discipline_id" /> 
</set> 
<property name="nume" column="Nume" type="string" /> 
<property name="prenume" column="Prenume" type="string" /> 
<property name="departament_id" column="Departamente_id" type="integer" /> 
</class> 

<class name="model.Grup" table="devgar_scoala.grupe"> 
<id name="id" unsaved-value="0"> 
<generator class="increment"/> 
</id> 
<set name="listaStudenti" table="devgar_scoala.`studenti-grupe`"> 
<key column="Grupe_id" /> 
<many-to-many column="Studenti_nrMatricol" class="model.Student" /> 
</set> 

<property name="nume" column="Grupa" type="string"/> 
<property name="programStudiu" column="progStudii_id" type="integer" /> 
</class> 
<class name="model.Disciplina" table="devgar_scoala.discipline" > 
<id name="id" > 
<generator class="increment"/> 
</id> 
<property name="denumire" column="Denumire" type="string"/> 
<property name="syllabus" type="string" column="Syllabus"/> 
<property name="schNotare" type="string" column="SchemaNotare"/> 

<set name="listaGrupuri" table="devgar_scoala.`Discipline-Grupe`"> 
<key column="Discipline_id" /> 
<many-to-many column="Grupe_id" class="model.Grup" /> 
</set> 

<set name="lectii" table="devgar_scoala.lectii"> 
<key column="Discipline_id" not-null="true"/> 
<one-to-many class="model.Lectie" /> 
</set> 
</class> 

唯一的 '搞笑' 的事情是,PROFESOR對象被加載不能與/由Hibernate但手動經典SQL的Java。這就是爲什麼我保存PROFESOR對象這樣

p - 手動加載PROFESOR對象

Profesor p2 = (Profesor) session.merge(p); 
session.saveOrUpdate(p2); 


//flush session of course 

在此之後,我得到了Java控制檯:

Hibernate: insert into devgar_scoala.grupe (Grupa, progStudii_id, id) values (?, ?, ?) 

但是當我看着數據庫表Grupe(組表)

+0

您使用的是交易嗎?如果是這樣,請確保您正在進行交易 – 2010-04-05 10:45:13

+0

您是否使用交易控制? – marcosbeirigo 2010-04-05 10:46:47

回答

3

正如在評論中提到的,我的猜測是你沒有提交更改。你可以嘗試這樣的:

Transaction tx = null; 
try { 
    tx = session.beginTransaction() 
    Profesor p2 = (Profesor) session.merge(p); 
    session.saveOrUpdate(p2); 
    tx.commit(); 
} catch(Exception e) { 
    tx.rollback(); 
} 

你也可以在你的配置文件中使用自動提交模式,以避免手動提交你的修改。在Hibernate reference中查找「hibernate.connection.autocommit」屬性。儘管如此,我認爲所有數據庫都不支持autocommit。

+0

是的。它適用於交易。但爲什麼沒有?我做了一個更簡單的項目,在那裏我不必使用事務,因爲它只能使用flush()。 – Blitzkr1eg 2010-04-05 11:01:37

+0

您可以使用應用程序管理的事務,例如Seam,MakeFaces等...支持,其中每個方法都使用AOP或其他mechanizem包裝在事務中,並在方法執行時沒有任何問題時提交,或者在有異常時回滾。如果您不想將所有代碼包裝在TX中,請查看按會話請求模式。 – Greg 2010-04-05 11:32:26

+0

您是否使用相同配置的相同數據庫?自動提交模式(在Hibernate方面)?根據數據庫,可以在配置數據庫時禁用事務支持(或啓用自動提交)。需要更多信息來幫助您找出差異。 – Barthelemy 2010-04-05 11:35:49

0

請確保您在事務內部運行代碼(在最後提交時):

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

Profesor p2 = (Profesor) session.merge(p); 
session.saveOrUpdate(p2); 

tx.commit(); 
session.close(); 
0

如果因爲交易是在你的MySQL(InnoDB引擎)被激活,所以你只需要你的MySQL服務器上提交或禁止交易不會與交易這是prolly工作...

但無論如何,它不是一個保持交易不壞的主意?

3

這個片段添加到您的Hibernate配置:

<property name = "current_session_context_class">thread</property>

這個使用此代碼:

Session session = factory.getCurrentSession(); 
Transaction tx = session.beginTransaction(); 

Profesor p2 = (Profesor) session.merge(p); 
session.saveOrUpdate(p2); 

tx.commit(); 

注意,合併是沒有必要的,你可以只調用saveOrUpdate,因爲這種方法如果對象具有標識符,則內部不合並。