Java 冬眠赢了';无法保存到数据库中

Java 冬眠赢了';无法保存到数据库中,java,database,hibernate,mapping,save,Java,Database,Hibernate,Mapping,Save,我用Java中的hibernate将一些类映射到一些表,我将hibernate设置为show SQL,它打开会话,它显示它执行SQL,它关闭会话,但没有修改数据库 实体 public class Profesor implements Comparable<Profesor> { private int id; private String nume; private String prenume; private int departament_id; private Set<

我用Java中的hibernate将一些类映射到一些表,我将hibernate设置为show 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;}
在此之后,我进入Java控制台:

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

但是,当我查看数据库时,GRUP表(Groups表)中没有新行。

请确保在事务中运行代码(最后提交):


正如评论中提到的,我的猜测是您没有提交更改。你可以试试这样的方法:

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

您还可以在配置文件中使用自动提交模式,以避免手动提交更改。在中查找“hibernate.connection.autocommit”属性。不过,我不认为所有数据库都支持自动提交。

如果它不能处理事务,那是因为事务是在mysql(innoDB引擎)上激活的,所以您只需在mysql服务器上提交或禁用事务


但无论如何,保留事务不是一个坏主意。否?

将此代码段添加到hibernate配置中:

线程


这将使用以下代码:

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

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

tx.commit();

请注意,合并不是必需的,您可以只调用saveOrUpdate,因为如果对象具有标识符,此方法在内部不进行合并。

是否使用事务?如果是,请确保您正在使用事务控制提交事务?是。它处理事务。但是为什么不呢?我做了一个简单得多的项目,在那里我不必使用事务,因为它只与flush()一起工作。。。支持使用AOP或其他mechanizem将每个方法包装在事务中,并在方法无问题执行时提交,或在出现异常时回滚。如果您不想将所有代码包装在TX中,请查看每个请求会话模式。您是否使用具有相同配置的相同数据库?自动提交模式是否打开(在休眠端)?根据数据库的不同,您可以在配置数据库时禁用事务支持(或启用自动提交)。需要更多信息来帮助您确定差异。您所说的“相同配置的相同数据库”是什么意思?自动提交模式我想它在hibernate端是关闭的,因为我刚开始使用hibernate,并且刚刚了解到该模式。谢谢你的帮助。我的意思是,在这两种情况下(工作时和不工作时),你都使用了什么数据库(mysql、sqlite、postgres)?在这两种情况下,您是如何创建数据库的?
Session session = factory.openSession();
Transaction tx = session.beginTransaction();

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

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

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

tx.commit();