2010-09-10 7 views
3

Imaginez une Employee entité qui fait référence à un Department utilisant un composé clé:activité à l'étranger Composite clé perdue dans la fusion() (JPA/Hibernate)

@Entity 
public class Employee { 
    ... 
    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name="dept_country", referencedColumnName="country"), 
     @JoinColumn(name="dept_id", referencedColumnName="id") 
    }) 
    private Department dept; 
    ... 

Lors d'une session Stateless Bean, j'associe un employé avec un département, en définissant l'attribut approprié:

employee.setAbc(abc); 
System.out.println(entityManager.contains(aDepartment))); //true 
employee.setDepartment(aDepartment); 
employee.setXyz(xyz); 
entityManager.merge(employee); 

=>Tous les attributs sont conservés correctement (mis à jour) dans la base de données, à l'exception duDépartement.

Je me demande si cela est lié à la clé composée, parce que quand je regarde le SQL Mise en veille prolongée en arrière-plan, exactement les colonnes de clé étrangère manquent.

14:46:18 INFO [STDOUT#write] Hibernate: 
14:46:18 INFO [STDOUT#write]  update 
14:46:18 INFO [STDOUT#write]   employees 
14:46:18 INFO [STDOUT#write]  set 
14:46:18 INFO [STDOUT#write]   abc=?, 
14:46:18 INFO [STDOUT#write]   xyz=?, 
14:46:18 INFO [STDOUT#write]  where 
14:46:18 INFO [STDOUT#write]   id=? 

J'espère que je manqué quelque chose de trivial ...

+0

Est-ce que 'Department' une collection de' Employee's? Montrez-le, s'il vous plaît. – axtavt

+1

Non, il n'y a pas de référence dans l'autre sens. (Navigation à sens unique.) Je composais cet exemple pour présenter ma question aussi simple que possible. En réalité, en réalité, ma clé composée est composée de plusieurs colonnes. Mais j'espérais que ce n'est pas pertinent à ce stade et que j'ai fait l'erreur de junior ... Thx de toute façon! – Jan

+1

Aussi remarquable: Dans un UnitTest il fonctionne très bien. Je n'observe le problème que dans le serveur d'applications, lorsqu'il fait partie d'un bean session sans état (JBoss6, Hibernate 3.5.0) – Jan

Répondre

2

Shoot me!

Comme je l'ai mentionné, j'ai constitué l'extrait de code Employee/Department ci-dessus pour clarifier mon cas. Je n'aurais pas dû faire ça! J'omises un élément clé: le drapeau updatable

En fait, mon cas se présente comme suit:

@ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name="dept_country", referencedColumnName="country", insertable = false, updatable = false), 
     @JoinColumn(name="dept_id", referencedColumnName="id", insertable = false, updatable = false) 
    }) 

Et la réponse à la question est assez évidente: Passer au updatable = true

Je suis désolé!

P.S: Pourtant, je suis perplexe pourquoi il a travaillé dans mes tests unitaires et non dans le serveur d'applications