Bonjour,
Je travaille avec le site «openfights.org». J'importe mes données.
J'ai une persistance «MyApp», 4 classes: Aireline, Airport, Route et RouteId. J'utilise H2 comme base de données. J'ai une classe ImportData pour importer mes données du site openfights.org.
Lors de l’importation des lignes aériennes et aéroportuaires, les données sont bien remplies.
le problème est que pour la classe Route, je devais faire une classe RouteId car j’avais plusieurs clés primaires.
Hibernate soulève une exception.
Classe Route :
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 @Entity public class Route { @EmbeddedId private RouteId id; private String airlineCode; @ManyToOne @MapsId("airlineId") private Airline airline; private String sourceCode; @ManyToOne @MapsId("sourceId") private Airport source; private String destinationCode; @ManyToOne @MapsId("destinationId") private Airport destination; private Boolean codeshare; private Short stops; private String equipment; public RouteId getId() { return id; } public void setId(RouteId id) { this.id = id; } public String getAirlineCode() { return airlineCode; } public void setAirlineCode(String airlineCode) { this.airlineCode = airlineCode; } public Airline getAirline() { return airline; } public void setAirline(Airline airline) { this.airline = airline; } public String getSourceCode() { return sourceCode; } public void setSourceCode(String sourceCode) { this.sourceCode = sourceCode; } public Airport getSource() { return source; } public void setSource(Airport source) { this.source = source; } public String getDestinationCode() { return destinationCode; } public void setDestinationCode(String destinationCode) { this.destinationCode = destinationCode; } public Airport getDestination() { return destination; } public void setDestination(Airport destination) { this.destination = destination; } public Boolean getCodeshare() { return codeshare; } public void setCodeshare(Boolean codeshare) { this.codeshare = codeshare; } public Short getStops() { return stops; } public void setStops(Short stops) { this.stops = stops; } public String getEquipment() { return equipment; } public void setEquipment(String equipment) { this.equipment = equipment; } }
Classe RouteId :
ma méthode d'importation des routes :
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 @Embeddable // The Java class for mapped type flights.RouteId is final public class RouteId implements Serializable { private static final long serialVersionUID = -2403746842148223177L; // assuming all Long ids private int airlineId; private int sourceId; private int destinationId; public int getAirlineId() { return airlineId; } public void setAirlineId(int airlineId) { this.airlineId = airlineId; } public int getSourceId() { return sourceId; } public void setSourceId(int sourceId) { this.sourceId = sourceId; } public int getDestinationId() { return destinationId; } public void setDestinationId(int destinationId) { this.destinationId = destinationId; } public static long getSerialversionuid() { return serialVersionUID; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + airlineId; result = prime * result + destinationId; result = prime * result + sourceId; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; RouteId other = (RouteId) obj; if (airlineId != other.airlineId) return false; if (destinationId != other.destinationId) return false; if (sourceId != other.sourceId) return false; return true; } // Omitted: constructors, getters/setters // Omitted: equals, hashCode and toString methods }
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 private static Route mapRoute(String[] data) { Route route = new Route(); int i = 0; route.setAirlineCode( parseNull(data[i++], ImportData::nopParse) ); Airline airline = new Airline(); Integer airlineId = parseNull(data[i++], Integer::parseInt); if ( airlineId == null ) return null; if ( !existingAirline.contains(airlineId) ) return null; airline.setId( airlineId ); route.setAirline( airline ); route.setSourceCode(parseNull(data[i++], ImportData::nopParse)); Airport source = new Airport(); Integer sourceId = parseNull(data[i++], Integer::parseInt); if ( sourceId == null ) return null; if ( !existingAirport.contains(sourceId) ) return null; source.setId( sourceId ); route.setSource(source); route.setDestinationCode(parseNull(data[i++], ImportData::nopParse)); Airport dest = new Airport(); Integer destId = parseNull(data[i++], Integer::parseInt); if ( destId == null ) return null; if ( !existingAirport.contains(destId) ) return null; dest.setId( destId ); route.setDestination(dest); route.setCodeshare( parseNull(data[i++], ImportData::booleanParse) ); route.setStops(parseNull(data[i++], Short::parseShort) ); route.setEquipment(parseNull(data[i++], ImportData::nopParse)); return route; }
Debug hibernate :
Hibernate: insert into Airline (active, alias, callsign, country, iata, icao, name, airlineId) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into Airline (active, alias, callsign, country, iata, icao, name, airlineId) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into Airline (active, alias, callsign, country, iata, icao, name, airlineId) values (?, ?, ?, ?, ?, ?, ?, ?)
DEBUG (ImportData.java) - Stream opened to [https://raw.githubusercontent.com/jp...ta/routes.dat]
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Could not set field value [410] value by reflection : [class flights.RouteId.airlineId] setter of flights.RouteId.airlineId
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:787)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:765)
at ImportData.importFromSource(ImportData.java:199)
at ImportData.main(ImportData.java:230)
Caused by: org.hibernate.PropertyAccessException: Could not set field value [410] value by reflection : [class flights.RouteId.airlineId] setter of flights.RouteId.airlineId
at org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:58)
at org.hibernate.mapping.Component$ValueGenerationPlan.execute(Component.java:419)
at org.hibernate.id.CompositeNestedGeneratedValueGenerator.generate(CompositeNestedGeneratedValueGenerator.java:97)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:105)
at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:780)
... 3 more
Caused by: java.lang.NullPointerException
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:57)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:75)
at java.lang.reflect.Field.set(Field.java:764)
at org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:38)
... 11 more
Partager