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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
@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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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