Bonjour,
J'ai un souci avec l'insertion et la lecture de donnée de ma base (postgresql).
Pour l’insertion j'ai une erreur lors du commit() et pour la lecture c'est lors du em.find(). Les 2 erreurs sont différentes mais je pense, viennent du même problème qui se trouve sur la clé primaire.
Voici l'entité de la table dans laquel je tente d'inserer :
Et voici comment je tente d'insérer :
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 @Entity @Cacheable(true) @Table(name = "game", schema="nintendo") @Multitenant(MultitenantType.TABLE_PER_TENANT) @TenantTableDiscriminator(type = TenantTableDiscriminatorType.SCHEMA, contextProperty = PersistenceUnitProperties.MULTITENANT_PROPERTY_DEFAULT) public class Game implements Serializable{ private static final long serialVersionUID = 1L; @Id @Column(name = "game_id", unique = true, nullable = false) @GeneratedValue(strategy=GenerationType.IDENTITY) private int gameId; @Column(name = "game_title", length = 256) private String gameTitle; @Temporal(TemporalType.DATE) @Column(name = "game_released") private Date gameReleased;
La lecture de l'objet "g" avant le commit se fait bien, je retrouve bien les informations que j'y ai mis.
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 EntityManagerFactory emf = Persistence.createEntityManagerFactory("projet_nintendo"); EntityManager em = emf.createEntityManager(); EntityTransaction transac = em.getTransaction(); transac.begin(); Game g = new Game(); g.setGameId(Conversion.stringEnInt(array.getJSONObject(ii).getString("fs_id"))); g.setGameTitle(array.getJSONObject(ii).getString("title")); em.persist(g); System.err.println(g.getGameTitle()); System.err.println(g.getGameId()); transac.commit(); em.close(); emf.close();
Ça plante lors du "transac.commit()" et j'ai l'erreur suivante :
Pour la lecture, voici le code :
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 Exception in thread "main" javax.persistence.RollbackException: Exception [EclipseLink-69] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DescriptorException Exception Description: A NullPointerException was thrown while extracting a value from the instance variable [gameId] in the object [database.orm.Game]. Internal Exception: java.lang.NullPointerException Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[gameId-->nintendo.game.game_id] Descriptor: RelationalDescriptor(database.orm.Game --> [DatabaseTable(nintendo.game)]) at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:157) at test.main(test.java:84) Caused by: Exception [EclipseLink-69] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DescriptorException Exception Description: A NullPointerException was thrown while extracting a value from the instance variable [gameId] in the object [database.orm.Game]. Internal Exception: java.lang.NullPointerException Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[gameId-->nintendo.game.game_id] Descriptor: RelationalDescriptor(database.orm.Game --> [DatabaseTable(nintendo.game)]) at org.eclipse.persistence.exceptions.DescriptorException.nullPointerWhileGettingValueThruInstanceVariableAccessor(DescriptorException.java:1277) at org.eclipse.persistence.internal.descriptors.InstanceVariableAttributeAccessor.getAttributeValueFromObject(InstanceVariableAttributeAccessor.java:88) at org.eclipse.persistence.mappings.DatabaseMapping.getAttributeValueFromObject(DatabaseMapping.java:630) at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.writeFromObjectIntoRow(AbstractDirectMapping.java:1283) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildRow(ObjectBuilder.java:1566) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildRow(ObjectBuilder.java:1554) at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:451) at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80) at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90) at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:301) at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58) at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899) at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:798) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1786) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1737) at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:226) at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:125) at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4207) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1441) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1531) at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:277) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1169) at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:132) ... 1 more Caused by: java.lang.NullPointerException at org.eclipse.persistence.internal.descriptors.InstanceVariableAttributeAccessor.getAttributeValueFromObject(InstanceVariableAttributeAccessor.java:76) ... 26 more
Ca plante sur la ligne ou je fais le em.find() et j'ai l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 EntityManagerFactory emf = Persistence.createEntityManagerFactory("projet_nintendo"); EntityManager em = emf.createEntityManager(); EntityTransaction transac = em.getTransaction(); transac.begin(); Game g = em.find(database.orm.Game.class, 125); System.err.println(g.getGameTitle()); System.err.println(g.getGameId()); transac.commit(); em.close(); emf.close();
Donc à chaque fois il est question de la clé primaire. J'ai essayé, dans ma base de la mettre en serial pour l'incrémenter toute seule mais aussi de l'incrémenter moi même mais l'un ou l'autre ne change rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Exception in thread "main" java.lang.NullPointerException at org.eclipse.persistence.internal.jpa.CMP3Policy.createPrimaryKeyFromId(CMP3Policy.java:224) at org.eclipse.persistence.internal.jpa.EntityManagerImpl.findInternal(EntityManagerImpl.java:797) at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:719) at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:588) at test.main(test.java:58)
Je pense que j'ai du oublié quelque chose dans la description de mon entité ou dans le persistence.xml mais je ne vois pas quoi.
Je vous mets le persistence.xml en plus si vous voyez quelque chose :
P.S, la connexion à la base se fait bien.
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 <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="projet_nintendo"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>database.orm.Utilisateur</class> <class>database.orm.Game</class> <class>database.orm.Currency</class> <class>database.orm.Country</class> <class>database.orm.Price</class> <class>database.orm.Favoris</class> <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> <properties> <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5433/projet_nintendo" /> <!-- BD Mane --> <property name="javax.persistence.jdbc.user" value="postgres" /> <!-- DB User --> <property name="javax.persistence.jdbc.password" value="monPassword" /> <!-- DB Password --> <property name="eclipselink.logging.level" value="OFF"/> <property name="eclipselink.cache.shared.default" value="true"/> <property name="eclipselink.multitenant.tenants-share-cache" value="true"/> <property name="eclipselink.query-results-cache" value="true"/> </properties> </persistence-unit> </persistence>
Merci de votre aide.
Partager