java Hibernate 不会保存到数据库中
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2577894/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Hibernate won't save into database
提问by AdrianS
I mapped some classes to some tables with hibernate in Java, i set Hibernate to show SQL, it opens the session, it shows that it does the SQL, it closes the session but there are no modifications to the database.
我使用 Java 中的休眠将一些类映射到一些表,我将 Hibernate 设置为显示 SQL,它打开会话,显示它执行 SQL,它关闭会话但没有对数据库进行修改。
Entity
实体
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;}
Mapping
映射
<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>
The only 'funny' thing is that the Profesor object gets loaded not with/by Hibernate but with manual classic SQL Java. Thats why i save the Profesor object like this
唯一“有趣”的事情是 Profesor 对象不是通过 Hibernate 加载的,而是通过手动经典 SQL Java 加载的。这就是为什么我像这样保存 Profesor 对象
p - the manually loaded Profesor object
p - 手动加载的 Profesor 对象
Profesor p2 = (Profesor) session.merge(p);
session.saveOrUpdate(p2);
//flush session of course
After this i get in the Java console:
在此之后,我进入 Java 控制台:
Hibernate: insert into devgar_scoala.grupe (Grupa, progStudii_id, id) values (?, ?, ?)
but when i look into the database there are no new rows in the table Grupe (the Groups table)
但是当我查看数据库时,Grupe 表(Groups 表)中没有新行
回答by Barthelemy
As mentioned in the comments, my guess is that you are not committing the changes. You could try something like that:
正如评论中提到的,我的猜测是您没有提交更改。你可以尝试这样的事情:
Transaction tx = null;
try {
tx = session.beginTransaction()
Profesor p2 = (Profesor) session.merge(p);
session.saveOrUpdate(p2);
tx.commit();
} catch(Exception e) {
tx.rollback();
}
You could also use the auto-commit mode in your configuration file to avoid manually committing your changes. Look for the "hibernate.connection.autocommit" property in the Hibernate reference. I don't think autocommit is supported (well) by all databases though.
您还可以在配置文件中使用自动提交模式来避免手动提交更改。在Hibernate 参考中查找“hibernate.connection.autocommit”属性。我不认为所有数据库都支持(很好)自动提交。
回答by Poso Lingofe
Add this snippet to your hibernate configuration:<property name = "current_session_context_class">thread</property>
this use this code:
将此代码段添加到您的休眠配置中:
使用以下代码:<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();
Note that the merge is not necessary, you could just call saveOrUpdate, because this method internally does na merge if the object has an identifier.
请注意,合并不是必需的,您可以只调用 saveOrUpdate,因为如果对象具有标识符,则此方法在内部进行合并。
回答by Pascal Thivent
Make sure you run your code inside a transaction (that you commit at the end):
确保在事务中运行代码(最后提交):
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Profesor p2 = (Profesor) session.merge(p);
session.saveOrUpdate(p2);
tx.commit();
session.close();
回答by Sebastien Lorber
If it doesn't work with transactions it's prolly because transactions are activated on your mysql (innoDB engine) so you just have to commit or disable transactions on your mysql server...
如果它不适用于事务,那很麻烦,因为事务已在您的 mysql(innoDB 引擎)上激活,因此您只需在 mysql 服务器上提交或禁用事务...
but anyway it's not a bad idea to keep transactions no???
但无论如何保持交易不是一个坏主意吗???

