Bonjour,

J'ai une application qui appelle un session bean :

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
 
public static void main(String[] args) {
        try {
 
            Context context = new InitialContext();
 
            GestionClient gestionClient = (GestionClient) context
                    .lookup("entreprise-ear/GestionClientBean/remote");
 
            Utilisateur user = new Utilisateur();
            user.setNom("TEST VILLE");
 
            List<Adresse> adresses = new ArrayList<Adresse>();
 
            Adresse adr = new Adresse();
            adr.setVille("VILLE");
            adresses.add(adr);            
 
            user.setAdresses(adresses);
 
            gestionClient.addUtilisateur(user);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
... et la méthode du Session Bean :

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
public void addUtilisateur(Utilisateur user) throws Exception {
        
        em.persist(user);
    
/*
        List<Adresse> adresses = user.getAdresses();
        
        for (Adresse adresse : adresses) {
            
            adresse.setUtilisateur(user);
            em.persist(adresse);
        }
*/
        
    }
Et voici les 2 Entity Bean associés :

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
 
@Entity
public class Utilisateur implements Serializable {
    private static final long serialVersionUID = 1L;
 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
 
    private String nom;
 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "utilisateur")
    private List<Adresse> adresses;
 
    public Utilisateur() {
    }
 
// accesseurs ...
... et son cousin :

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
 
@Entity
public class Adresse implements Serializable {
    private static final long serialVersionUID = 1L;
 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
 
    private String ville;
 
    @ManyToOne
    @JoinColumn(name = "utilisateur_fk", referencedColumnName = "id")
    private Utilisateur utilisateur;
 
// accesseurs ...
Un utilisateur peut donc avoir plusieurs adresses et il existe donc une relation (1,1 to 1,n) entre la table Utilisateur et la table Adresse.

Et bien la ligne :

... du Session Bean ajoute bien l'utilisateur.

Mais quand je décommente les lignes :

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
public void addUtilisateur(Utilisateur user) throws Exception {
        
        em.persist(user);
    

        List<Adresse> adresses = user.getAdresses();
        
        for (Adresse adresse : adresses) {
            
            adresse.setUtilisateur(user);
            em.persist(adresse);
        }

        
    }
... j'obtiens l'exception suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
2008-12-15 02:51:55,927 DEBUG [org.hibernate.util.JDBCExceptionReporter] (WorkerThread#0[127.0.0.1:54640]) could not insert: [entity.Adresse] [insert into Adresse (utilisateur_fk, ville) values (?, ?)]
java.sql.SQLException: Field 'id' doesn't have a default value
Pourquoi cela ?

A+