2010-04-05 175 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,因为这种方法如果对象具有标识符,则内部不合并。