Bonjour.

Je dois mapper un map contenant en index un Integer et en élément un objet Perception. Map<Integer, Perception>
Cette map est un attribut de la classe MyClass
Mapping de MyClass:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<class name="test.model.MyClass" table="myClass" catalog="test">
		<id name="id" type="java.lang.Integer">
			<column name="id" />
			<generator class="increment" />
		</id>
 
                <map name="visibility" table="visibility" cascade="all">
			<key column="id" />
			<index-many-to-many column="sense" class="test.model.Sense"/>
			<many-to-many column="perception" class="test.model.Perception"/>
		</map>
</class>
Mapping de Perception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
    <class name="test.model.Perception" table="perception" catalog="test">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>        
    </class>
Mapping de Sense
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
<class name="Sense" table="sense" catalog="test">
  <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>
</class>
Code java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
Map<Integer, Perception> visibility = new HashMap<Integer, Perception>();
MyClass myClass= new myClass();
Perception perception1= new Perception();
Perception perception2= new Perception();
 
visibility.put(1, perception1);
visibility.put(2, perception2);
 
myClass.setVisibility(visibility);
sess.save(perception1);
sess.save(perception2);
sess.save(myClass);
Si je n'ajoute qu'un seul Element à ma map visibility, la sauvegarde se passe sans problème. Si j'en mets plusieurs j'ai :
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
 
Hibernate: insert into myclass (id) values (?)
Hibernate: insert into perception(id) values (?)
Hibernate: insert into perception(id) values (?)
Hibernate: insert into visibility (id, sense, perception) values (?, ?, ?)
Hibernate: insert into visibility (id, sense, perception) values (?, ?, ?)
 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:145)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	at test.main.main(main.java:82)
Caused by: java.sql.BatchUpdateException: Duplicate entry '1' for key 'PRIMARY'
	at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1257)
	at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:943)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	... 8 more
Il y a donc un problème d'auto-increment dans la table visibility. Elle est pourtant paramétrée pour être en auto-incrément. J'ai testé avec des inserts en dur ça passe sans soucis dans la table visibility.

J'ai essayé en mettant des flush un peu partout pour récupérer les index, mais comme la table visibility n'est pas un objet mappé il ne récupère pas le dernier id inséré ...
Il y a surement un paramètre que j'ai oublié de préciser quelque part mais je ne vois pas ce qui pourrait me débloquer.

Merci pour votre aide.

Benoit