Quand je fais un merge sur un objet avec un Id simple pas de soucis (l objet n existe pas en DB et n est pas deja attache). Generator=assigned
Les memes conditions avec un composite-id me renvoi un objet aux ids=null
Pourquoi ?
Version imprimable
Quand je fais un merge sur un objet avec un Id simple pas de soucis (l objet n existe pas en DB et n est pas deja attache). Generator=assigned
Les memes conditions avec un composite-id me renvoi un objet aux ids=null
Pourquoi ?
Bonjour,
faut montrer un peu de code.
Cordialement,
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- Generated May 10, 2011 1:14:11 PM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.amadeus.sep.lsr.refautomation.reference_bo.CityName" table="TP_CityName"> <composite-id> <key-property name="languageCode" column="LanguageCode" type="java.lang.String"></key-property> <key-property name="cityCode" column="CityCode" type="java.lang.String"></key-property> <generator class="assigned"></generator> </composite-id> <property column="CityName" generated="never" lazy="false" name="cityName" /> </class> </hibernate-mapping>
on niveau DAO (le merge pour des raisons de robustesse):Code:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 public class CityName extends Entity implements Serializable{ /** * */ private static final long serialVersionUID = -1053883640497293572L; private String languageCode; private String cityCode; private String cityName; //Internal usage private Boolean isAirport; //Internal usage private String relatedCityCode; public CityName(){ super.setIdFieldsName("cityCode","languageCode"); super.setComparedFieldsName("cityName"); } public String getRelatedCityCode() { return relatedCityCode; } public void setRelatedCityCode(String relatedCityCode) { this.relatedCityCode = relatedCityCode; } public Boolean getIsAirport() { return isAirport; } public void setIsAirport(Boolean isAirport) { this.isAirport = isAirport; } public String getLanguageCode() { return languageCode; } public void setLanguageCode(String languageCode) { this.languageCode = languageCode; } public String getCityCode() { return cityCode; } public void setCityCode(String cityCode) { this.cityCode = cityCode; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } public String toString(){ return "CityName: "+cityCode+" - "+languageCode; } }
L'objet mergedEntity a des valeurs de Id null pour le composite ci dessus décritCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 /** * Save or Update the entity */ public T makePersistent(T entity) throws HibernateException { T mergedEntity=null; try { this.beginTransaction(); mergedEntity=(T)this.openSession().merge(entity); this.openSession().saveOrUpdate(mergedEntity); } catch (HibernateException e) { this.handleHibernateException(e); throw e; } return entity; }
et il avait un id avant le merge?
oui oui, il y a bien un id avant le merge
Je ne vois pas trop l'utilité du merge suivi du saveorupdate...
Et en plus dans une session différente ? Puisque tu as deux openSession consécutifs...
le openSession renvoi la session courante si deja ouverte (donc c est la meme).
Le merge sert a synchroniser un objet avec le cache si besoin. J ai besoin de cette assurance pour ma part.
Tout le probleme reste dans la premiere ligne: mergedEntity a des id=null
Je sais bien à quoi sert le merge, mais il ne nécessite pas de saveOrUpdate.
apres la synchronization je fais un saveOrUpdate pour persister l objet en DB (c est le but finale)
Ce que fait pas le merge.
Ben justement si, le merge est censé sauvegarder tes modifs en base.
Et même t'en créer un s'il n'existe pas.
Ah oui, effectivement le saveOrUpdate fait doublon (exacte aussi pour le mergedEntity qui n'est pas renvoyé). Je croyais qu'il ne servait qu'à synchroniser le cache.
Le commit et fait ailleurs (transaction longue)
mais en debug mergedEntity à des id=null pour des clefs composites
ce qui reste mon problème.
en debug? Il faut passer par les getters / setters pour vérifier l'id. Hibernate peux faire du lazy loading sur les attributs.