Quelqu'un aurait un exemple complet de mapping xml avec hibernate.
C'est à dire à partir d'un fichier xml de pouvoir alimenter une base de donnée, et inverssement (à partir des données de la base de donnée de pouvoir générer un fichier xml)
Dans le cas d'un fichier fichier xml qui alimente qu'une seule table, il n'y a pas de soucis j'y arrive parfaitement. Mon problème vient lorsque je veux à partir du même fichier xml alimenter plusieurs tables. (en l'occurance 2).
Je vous joins les sources en esperant que vous allez pouvoir me dire ce que je dois changer pour alimenter 2 tables à partir d'un seul fichier xml.
le fichier XML (todo-ex.xml)
mappingXML/TodoTask.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 <todolist> <todo id="004" priority="2"> <sum>installer eclipse</sum> <descr>une nouvelle version est disponible</descr> </todo> <todo id="005" priority="1"> <sum>redemarrer le serveur</sum> <descr>une mise a jour du serveur tartenpion necessite un redemarrage</descr> </todo> <todo id="006" priority="3"> <sum>documentation du product</sum> <descr>faire une documentation complete de notre super produit</descr> </todo> </todolist>
TodoTask.hmb.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 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="bean"> <class name="TodoTask" table="todo_task" node="todo"> <id name="todoid" node="@id"/> <property name="summary" not-null="true" node="sum"/> <property name="description" node="descr"/> <property name="priority" node="@priority"/> <property name="doneDate" column="done"/> </class> </hibernate-mapping>
bean.TodoTask.java
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="com.hibernate"> <class name="TodoTask" table="todo_task" > <meta attribute="sync-DAO">false</meta> <property name="Todoid" column="todoid" type="java.lang.Long" not-null="true" length="4" /> <property name="Summary" column="summary" type="string" not-null="true" length="45" /> <property name="Description" column="description" type="string" not-null="false" length="45" /> <property name="Priority" column="priority" type="java.lang.Long" not-null="false" length="4" /> <property name="Done" column="done" type="timestamp" not-null="false" length="8" /> </class> </hibernate-mapping>
la table todo_task
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
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
71
72 package bean; import java.util.Calendar; public class TodoTask { protected int todoid; protected String summary; protected String description; protected int priority; protected Calendar doneDate; /** * @return Returns the description. */ public String getDescription() { return description; } /** * @param description The description to set. */ public void setDescription(String description) { this.description = description; } /** * @return Returns the doneDate. */ public Calendar getDoneDate() { return doneDate; } /** * @param doneDate The doneDate to set. */ public void setDoneDate(Calendar doneDate) { this.doneDate = doneDate; } /** * @return Returns the priority. */ public int getPriority() { return priority; } /** * @param priority The priority to set. */ public void setPriority(int priority) { this.priority = priority; } /** * @return Returns the summary. */ public String getSummary() { return summary; } /** * @param summary The summary to set. */ public void setSummary(String summary) { this.summary = summary; } /** * @return Returns the todoid. */ public int getTodoid() { return todoid; } /** * @param todoid The todoid to set. */ public void setTodoid(int todoid) { this.todoid = todoid; } }
Et voilà le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CREATE TABLE todo_task ( todoid integer NOT NULL, summary character varying(200) NOT NULL, description character varying(200), priority integer, done timestamp without time zone, CONSTRAINT todo_task_pkey PRIMARY KEY (todoid) )
Ca ca marche trés bien les données du fichier xml se retrouve bien dans ma base de donné. Mais maintenant imaginons par exemple que je veuille gérer des catégories.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 public MappingXML(String file){ Configuration cfg = new Configuration() .addResource(file) ; cfg.configure() ; sessionFactory = cfg.buildSessionFactory(); } public void insertXML(String file, String mapping, String XPath) { SAXReader sr ; Document doc ; doc = null ; sr = new SAXReader(false) ; try { doc = sr.read(ClassLoader.getSystemClassLoader().getResourceAsStream("file")); } catch (DocumentException e1) { log.log(Level.SEVERE, e1.getMessage()); e1.printStackTrace(); } List todo=doc.selectNodes(XPath); Session session = sessionFactory.openSession(); Session xmlSession = session.getSession(EntityMode.DOM4J); Transaction tx=session.beginTransaction(); for (Iterator it=todo.iterator(); it.hasNext(); ) { xmlSession.saveOrUpdate(mapping,it.next()); } tx.commit(); session.close(); } public static void main(String[] args) { MappingXML mapxml = new MappingXML("mappingXML/Todo.hbm.xml"); mapxml .insertXML(todo-ex.xml, "bean.TodoTask", "//todo"); }
Pouvais vous me dire les modification à apporter dans toutes ces pages pour que le résultat soit le même avec le même mode opératoire.
Imaginons donc 1 table supplémentaire
et un champs supplémentaire dans la table todo_task
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE TABLE cat_task ( catid integer NOT NULL, libellecharacter varying(200) NOT NULL, CONSTRAINT cat_task_pkey PRIMARY KEY (catid ) )
et bien sur cat_id est la clé etrangére de la table cat_task
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE TABLE todo_task ( todoid integer NOT NULL, summary character varying(200) NOT NULL, description character varying(200), priority integer, done timestamp without time zone, cat_id integer NOT NULL, CONSTRAINT todo_task_pkey PRIMARY KEY (todoid) )
Je vous donne également un exemple du nouveau fichier xml
Merci de votre aide
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 <todolist> <todo id="004" priority="2"> <sum>installer eclipse</sum> <descr>une nouvelle version est disponible</descr> <cat>Divers</cat> </todo> <todo id="005" priority="1"> <sum>redemarrer le serveur</sum> <descr>une mise a jour du serveur tartenpion necessite un redemarrage</descr> <cat>Boulot</cat> </todo> <todo id="006" priority="3"> <sum>documentation du product</sum> <descr>faire une documentation complete de notre super produit</descr> <cat>Boulot</cat> </todo> </todolist>
Partager