Hibernate не сохранится в базу данных - PullRequest
2 голосов
/ 05 апреля 2010

Я сопоставил некоторые классы с некоторыми таблицами в Hibernate на 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>

Единственное «забавное» - это то, что объект Profesor загружается не с / Hibernate, а с классической ручной Java 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 (таблица Groups)

Ответы [ 4 ]

3 голосов
/ 28 сентября 2010

Добавьте этот фрагмент в конфигурацию спящего режима:

<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, потому что этот метод внутренне не выполняет слияние, если объект имеет идентификатор.

3 голосов
/ 05 апреля 2010

Как уже упоминалось в комментариях, я предполагаю, что вы не вносите изменения. Вы можете попробовать что-то вроде этого:

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" в справочнике Hibernate . Я не думаю, что autocommit поддерживается (хорошо) всеми базами данных.

0 голосов
/ 05 апреля 2010

Если он не работает с транзакциями, это происходит из-за того, что транзакции активируются на вашем MySQL (движок innoDB), поэтому вам просто нужно зафиксировать или отключить транзакции на вашем MySQL сервере ...

но все равно неплохо держать транзакции нет ???

0 голосов
/ 05 апреля 2010

Убедитесь, что вы выполняете свой код внутри транзакции (которую вы делаете в конце):

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

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

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