Bonjour,
Je dispose d'une entité sur laquelle je fais un saveOrUpdate() :
Department.hbm.xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public void SaveToDB(Department department, Integer countryId, Integer userId, Integer id) throws DataAccessException { Department d = null; try { SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.openSession(); org.hibernate.Transaction tx = session.beginTransaction(); Country country = (Country) session.load(Country.class, countryId); User user = (User) session.load(User.class, userId); d = department; d.setCountry(country); d.setUser(user); session.saveOrUpdate(d); tx.commit(); session.flush(); session.close(); } catch (Exception e) { System.out.println(e.getMessage()); } }
Quelques explications :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 06-Apr-2009 11:35:45 by Hibernate Tools 3.2.1.GA --> <hibernate-mapping> <class catalog="poka_db" name="com.poka.domain.Department" table="department"> <id name="departmentId" type="java.lang.Integer" unsaved-value="0"> <column name="department_id" not-null="true"/> <generator class="increment"/> </id> <many-to-one class="com.poka.domain.User" fetch="select" name="user"> <column name="fk_user_id"/> </many-to-one> <many-to-one class="com.poka.domain.Country" fetch="select" name="country"> <column name="fk_country_id"/> </many-to-one> <property name="name" type="string"> <column name="name"/> </property> </class> </hibernate-mapping>
Avec le code fourni juste avant, la création d'un Department se fait très bien en bdd. Par contre, lorsque je sélectionne un Department déjà crée au sein de mon interface web et que j'update, ca ne marche pas. Impossible d'insérer en bdd.
Si je met "<generator class="native"/>" et pas de "unsaved-value" ca me crée un doublon en bdd : les champs modifiés sont bien pris en compte, mais au sein d'une nouvelle ligne dans la bdd avec un autre id (en gros il ne fait pas de delete sur les données initiales).
Je ne comprends pas très bien le fonctionnement de ce saveOrUpdate()
Vos lumières seront grandement appréciées !
Merci et bonne journée.
Partager