Exception Java Hibernate : NonUniqueObjectException
Bonsoir,
Depuis quelques jours j'essaye de trouver une solution à mon problème mais j'arrive pas à le résoudre :(
J'essaye de créer une interface web de création de zone qui contient plusieurs stations (une zone peut contenir plusieurs stations et une station ne peut appartenir qu'a une seule zone)
sql
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| CREATE TABLE "ZONE"(
"IZONE_ID" NUMBER(*,0) NOT NULL,
"SZONE_NAME" VARCHAR2(20) NOT NULL UNIQUE,
CONSTRAINT PK_ZONES PRIMARY KEY ("IZONE_ID")
);
CREATE TABLE "ZONE_STATION"(
"IZONE_ID" NUMBER(*,0) NOT NULL,
"SSTATION_CODE" VARCHAR2(3 CHAR) NOT NULL,
CONSTRAINT PK_ZONE_STATION PRIMARY KEY ("IZONE_ID","SSTATION_CODE"),
CONSTRAINT ZONE_FK FOREIGN KEY ("IZONE_ID") REFERENCES "ZONE" ("IZONE_ID") ON DELETE CASCADE ENABLE
); |
j'ai trois classes zone, zoneStation et zoneStationId
zone.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Entity
@Table(name = "ZONE")
@SequenceGenerator(name="ZONE_SEQ", sequenceName="ZONE_SEQ", allocationSize=1)
public class Zone implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ZONE_SEQ")
@Column(name = "IZONE_ID", nullable = false, unique = true)
private Long id;
@Column(name = "SZONE_NAME", length = 20)
private String zoneName;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "IZONE_ID")
private Set<ZoneStation> stationList;
//getter + setter |
ZoneStation.java
Code:
1 2 3 4 5 6 7 8
| @Entity
@Table(name = "ZONE_STATION")
public class ZoneStation implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private ZoneStationId id; |
Et ZoneStationId.java
Code:
1 2 3 4 5 6 7 8 9 10 11
|
@Embeddable
public class ZoneStationId implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "IZONE_ID")
private Long zoneId;
@Column(name = "SSTATION_CODE", length = 3)
private String stationCode; |
j'essaye de créer un nouvelle zone :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Zone insertZone = new Zone();
Set<ZoneStation> zoneStationSet = new HashSet<ZoneStation>();
//initialisae the Set
ListDetailsStation = Arrays.asList(zoneDetail.getListStation()); //zoneDetail contient un nom, un code et un tableau de string contenant la liste des stations
//voir plus bas
if (ListDetailsStation.size() > 0){
Iterator i = ListDetailsStation.iterator();
while(i.hasNext()){
ZoneStationId detailId = new ZoneStationId();
ZoneStation zoneStation = new ZoneStation();
detailId.setStationCode(i.next().toString());
zoneStation.setId(detailId);
//zoneStation.setZone(insertZone);
zoneStationSet.add(zoneStation);
} //end While
} //end if
insertZone.setZoneName(zoneDetail.getName()); //OK
insertZone.setStationList(zoneStationSet); //OK
zoneDAO.saveOrUpdate(insertZone); //exception NonUniqueObjectException |
Code:
1 2 3 4 5
| public class ZoneDetail implements java.io.Serializable {
private java.lang.String code;
private java.lang.String name;
public static final int NB_DETAIL_STATION = 10;
public String[] listStation = null; |
La console m'affiche
Code:
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
| org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.airfrance.vtruck.entity.ZoneStation#ZoneStationId [zoneId=null, stationCode=]]
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:190)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:143)
at org.hibernate.ejb.event.EJB3SaveOrUpdateEventListener.saveWithGeneratedId(EJB3SaveOrUpdateEventListener.java:62)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
at org.hibernate.engine.Cascade.cascade(Cascade.java:127)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:112)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673)
at com.afklm.jraf.provider.persistence.hibernate.AbstractDAOGenericImpl.saveOrUpdateNoFlush(AbstractDAOGenericImpl.java:640)
... 71 more |
Merci d'avance pour votre aide