2012-08-15 4 views
1

J'ai une question à poser:OneToOne avec Spring et JSP

Je dois tables utilisateur et user_login rejoint OneToOne par user.id -> user_login.user_id.

Le problème est quand je fais .updateObject (utilisateur) Je reçois 2 requêtes exécutées:

Mise en veille prolongée:? Insérer dans les valeurs utilisateur (création, modification, email, prenom, nom_famille) (,, ?,?,?) Hibernate: insérer dans user_login (créé, modifié, mot de passe, user_id) valeurs (?,?,?,?) [2012-08-15 12: 15: 04,192] [ERREUR] [http- bio-8080-exec-1] SqlExceptionHelper [144]: Colonne 'user_id' ne peut pas être nul

et regarde l Comme il n'y a pas de référence entre 2 objets. Si dans l'utilisateur d'entité, la méthode setUserLogin I ajoute la ligne userLogin.setUser (this); son fonctionnement mais je ne trouve pas cette façon élégante honnêtement. Y at-il quelque chose que j'ai manqué dans la configuration de l'entité peut-être que cela ne le fait pas automatiquement?

Merci

Voici mes entités

@Entity 
@NamedQueries({ @NamedQuery(name = "user.list", query = "select u from User u") }) 
public class User implements java.io.Serializable { 

    @Column(name = "first_name", nullable = true) 
    private String firstName; 

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumn(name="user_id", nullable=false) 
    private UserLogin userLogin; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 


    public UserLogin getUserLogin() { 
     return userLogin; 
    } 

    public void setUserLogin(UserLogin userLogin) { 
     this.userLogin = userLogin; 
     //userLogin.setUser(this); THIS IS THE LINE THAT FIXES IT, BUT I DONT FIND THIS WAY ELEGANT 
    } 

} 


@Entity 
@Table(name="user_login") 
public class UserLogin implements java.io.Serializable { 

    @Column(name = "password", nullable = false) 
    private String password; 


    @OneToOne(optional = false, fetch = FetchType.LAZY) 
    private User user; 


    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

} 

JSP fichier:

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 
<html> 
<head> 
<title>Registration Page</title> 
</head> 
<body> 
    <form:form action="/test" commandName="user"> 
     <tr> 
      <td>User Name :</td> 
      <td><form:input path="firstName" /></td> 
     </tr> 
     <tr> 
      <td>Password :</td> 
      <td><form:input path="userLogin.password" /></td> 
     </tr> 
     <tr> 
      <td colspan="2"><input type="submit" value="Register"></td> 
     </tr> 
     </table> 
    </form:form> 
</body> 
</html> 

Controller Spring:

@Controller(value = "/") 
public class Test { 

    @Autowired 
    UserServiceImpl userServiceImpl; 

    @RequestMapping(method = RequestMethod.GET, value = "/test") 
    public void test(ModelMap model) { 

    model.addAttribute("user", new User()); 

    } 

    @RequestMapping(method = RequestMethod.POST, value = "/test") 
    public void test(User user) { 

    userServiceImpl.update(user);  

    } 
} 
+0

Le code de vos entités est-il complet? –

+0

Oui, je n'ai tout simplement pas coller les importations. Aussi, bien sûr, je vais ajouter plus de champs – Dima

Répondre

2

Comme les relations habituelles, bidirectionnelles n'ont côté posséder . Le côté propriétaire de la relation est l'attribut référencé par mappedBy. Dans votre cas, l'attribut user dans UserLogin entité est le côté propriétaire.

Lorsque la relation est conservée dans la base de données, seul le propriétaire est consulté. Cela signifie que vous devez définir la valeur de l'attribut user pour pouvoir persister. Garder aussi le graphe d'entité en mémoire cohérent des deux côtés de la relation doit être défini.

Dans JPA 2.0 est dit avec les mots suivants:

relations entre les entités gérées Bidirectionnel seront persistaient en fonction des références détenues par le côté possédante de la relation. Il est de la responsabilité du développeur de conserver les références en mémoire du côté propriétaire et celles du côté inverse de lorsqu'elles changent.