Bonjour,
je suis de nouveau confronté à un souçis dans le cadre de mon apprentissage d'hibernate.
Soit mes deux objets "quote" et "security". les security sont associés à des quotes (relation un à plusieurs).
les quotes, eux ne sont associés qu'à un et un seul security.
Dans une BDR on traduirait cela par le fait qu'un quote a une foreign key qui référence la primary key d'un security.
J'ai donc réalisé le mapping suivant:
fichier BeanFinancialDataQuote.hbm.xml :
fichier BeanFinancialDataSecurity.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 <hibernate-mapping> <class name="beans.BeanFinancialDataQuote" table="quote"> <id name="id" column="id"> <generator class="sequence"> <param name="sequence">quote_id_seq</param> </generator> </id> <property name="_price" column="quoteprice"/> <property name="_date" type ="timestamp" column="quotedate"/> <many-to-one name="security" class="beans.BeanFinancialDataSecurity" column="security_id" not-null="true"/> </class> </hibernate-mapping>
Maintenant dans mon appli je fais ce bout de code dans le main pour tester :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <hibernate-mapping> <class name="beans.BeanFinancialDataSecurity" table="security"> <id name="id" column="id"> <generator class="sequence"> <param name="sequence">security_id_seq</param> </generator> </id> <property name="_name" column="name" /> <property name="_isin" column="isin" /> </class> </hibernate-mapping>
Le message d'erreur :
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 // je récupère ma session Hibernate Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); // j'ajoute deux "security" BeanFinancialDataSecurity security = new BeanFinancialDataSecurity(); security.set_isin("FR350653"); security.set_name("air liquide"); session.save(security); BeanFinancialDataSecurity security2 = new BeanFinancialDataSecurity(); security2.set_isin("FR102921"); security2.set_name("AXA"); session.save(security2); // je récupère le security avec name ="axa" pour avoir son Id BeanFinancialDataSecurity securityLoaded = (BeanFinancialDataSecurity)session.createQuery("from BeanFinancialDataSecurity where _name='AXA'").uniqueResult(); // je fabrique un quote BeanFinancialDataQuote quote = new BeanFinancialDataQuote() ; quote.set_price(500); quote.set_date(new Date()); // Je met la foreign Key qui correspond à Axa quote.setSecurity(securityLoaded.getId()); System.out.println("----------- going to plant-------------"); session.save(quote); System.out.println("----------- planted -------------"); session.getTransaction().commit(); System.out.println("commited");
----------- going to plant-------------
08:06:28,104 DEBUG ThreadLocalSessionContext:300 - allowing proxied method [save] to proceed to real session
08:06:28,104 DEBUG DefaultSaveOrUpdateEventListener:158 - saving transient instance
08:06:28,104 DEBUG AbstractBatcher:366 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
08:06:28,104 DEBUG SQL:401 - select nextval ('quote_id_seq')
Hibernate: select nextval ('quote_id_seq')
08:06:28,104 DEBUG AbstractBatcher:484 - preparing statement
08:06:28,114 DEBUG SequenceGenerator:82 - Sequence identifier generated: 1
08:06:28,114 DEBUG AbstractBatcher:374 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
08:06:28,114 DEBUG AbstractBatcher:533 - closing statement
08:06:28,114 DEBUG AbstractSaveEventListener:112 - generated identifier: 1, using strategy: org.hibernate.id.SequenceGenerator
08:06:28,124 DEBUG AbstractSaveEventListener:153 - saving [beans.BeanFinancialDataQuote#1]
08:06:28,124 ERROR BasicPropertyAccessor:167 - IllegalArgumentException in class: beans.BeanFinancialDataSecurity, getter method of property: id
Exception in thread "main" org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of beans.BeanFinancialDataSecurity.id
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3591)
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3307)
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
at org.hibernate.engine.ForeignKeys$Nullifier.isNullifiable(ForeignKeys.java:137)
at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:69)
at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:47)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy0.save(Unknown Source)
at main.SecurityManager.createAndStore(SecurityManager.java:53)
at main.SecurityManager.main(SecurityManager.java:21)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145)
... 26 more
Partager