Bonjour,
J'ai un soucis avec hibernate et la base de données HSQL.
Quand je me connecte à ma base de donnée (embarquée dans mon application), les fichiers sont bien créés (voir PJ : structureProjet.png).
Je lance une requète de "create tabl"e puis un "save(Object)" avec hibernate:
Ma classe HibernateUtil:
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 HibernateUtil hibernateUtil = new HibernateUtil(); hibernateUtil.executeSQLCommand("create table survey (id int,name varchar);"); Session session = hibernateUtil.getSession(); Survey survey = new Survey(); survey.setName("Survey"); System.out.println(survey.getId()); session.save(survey); session.flush(); System.out.println(survey.getId()); Survey surveyInSession = (Survey) session.get(Survey.class, survey.getId()); System.out.println(surveyInSession.getName()); session.close(); hibernateUtil.checkData("select * from survey"); hibernateUtil.stopServer();
Ma configuration hibernate:
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 public class HibernateUtil { Server server; Session session; Statement st; public HibernateUtil() throws Exception { SessionFactory sessionFactory = new Configuration().configure() .buildSessionFactory(); session = sessionFactory.openSession(); // Load the JDBC driver. server = (Server) Class.forName("org.hsqldb.Server").newInstance(); server.setDatabasePath(0, "data/tutorial"); server.setDatabaseName(0, "tutorial"); server.start(); System.out.println("Server Started."); // Establish the connection to the database. String url = "jdbc:hsqldb:hsql://localhost/tutorial"; Connection conn = DriverManager.getConnection(url, "sa", ""); System.out.println("Got Connection."); st = conn.createStatement(); } public void stopServer() { server.stop(); } public Session getSession() { return session; } public void executeSQLCommand(String sql) throws Exception { st.executeUpdate(sql); } public void checkData(String sql) throws Exception { ResultSet rs = st.executeQuery(sql); ResultSetMetaData metadata = rs.getMetaData(); for (int i = 0; i < metadata.getColumnCount(); i++) { System.out.print("\t" + metadata.getColumnLabel(i + 1)); } System.out.println("\n----------------------------------"); while (rs.next()) { for (int i = 0; i < metadata.getColumnCount(); i++) { Object value = rs.getObject(i + 1); if (value == null) { System.out.print("\t "); } else { System.out.print("\t" + value.toString().trim()); } } System.out.println(""); } } }
Mon fichier de mapping:
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 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property> <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.url">jdbc:hsqldb:hsql://localhost/tutorial</property> <property name="connection.username">sa</property> <property name="connection.password"></property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- Enable Hibernate's current session context --> <property name="current_session_context_class">org.hibernate.context.ManagedSessionContext</property> <property name="hibernate.cache.use_second_level_cache">false</property> <property name="hibernate.cache.use_query_cache">false</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">false</property> <!-- Mapping files --> <mapping resource="Survey.hbm.xml"/> </session-factory> </hibernate-configuration>
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 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="Survey" table="SURVEY"> <cache usage="read-write"/> <id name="id" column="ID" type="java.lang.Long"> <generator class="increment"/> </id> <property name="name" column="name" type="java.lang.String"/> </class> </hibernate-mapping>
L'exécution ce passe parfaitement bien (même le "select" me retourne mon objet inséré dans la base) mais quand je relance le processus, le "create table" devrait me lancer un exception car la table existe déjà. Au lieu de ça il la recréée.
je pense que ma première exécution n'a pas écrit dans la base est est resté en mémoire.
Comment rendre les données persistantes?
Merci d'avance.
Spiritkill.
Partager