2010-10-01 2 views
2

J'ai une simple application web printemps mvc qui peut gérer simple magasin de livres. J'ai un problème lorsque le livre existant est en cours de mise à jour.mise à jour tableau en utilisant le printemps mvc web et hibernate

Je souhaite mettre à jour le titre d'un livre. Mon updateBook.jsp est quelque chose comme ça. Problème: J'ai java class, "UpdateBookController" pour gérer la mise à jour du livre. Comment puis-je gérer les titres de livres précédents et nouveaux dans la classe "UpdateBookController".

une idée ..?

Merci d'avance!

Répondre

0

Que diriez-vous quelque chose comme ceci:

Session sess = null; 
try { 
    SessionFactory fact = new Configuration().configure().buildSessionFactory(); 
    sess = fact.openSession(); 
    Transaction tr = sess.beginTransaction(); 
    Book book = (Book)sess.get(Book.class, new Long(<id of the book to update>)); 
    book.setTitle(<new title>); 
    sess.update(book); 
    tr.commit(); 
    sess.close(); 
    System.out.println("Update successfully!"); 
} 
catch(Exception e){ 
    System.out.println(e.getMessage()); 
} 

Cependant, vous pouvez utiliser le modèle DAO pour gérer cela de manière ordonnée.

+3

Le point d'utilisation de Spring est que vous pouvez ignorer tout ce code standard. Voir ici: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/orm.html#orm-hibernate-straight –

+0

Oui je le sais, mais à l'origine il n'y avait pas beaucoup spécifié dans la question, donc je viens de donner un aperçu très basique des étapes nécessaires pour faire une mise à jour. Bien sûr, vous pouvez utiliser un gestionnaire de transactions et d'autres choses, mais ce n'est pas le point de la question, je crois ... –

3

Spring 3.0 manière

@Controller 
public class BookController { 

    @Autowired 
    private BookRepository<Book, Integer> bookRepository; 

    @RequestMapping(method=RequestMethod.POST) 
    public void updateTitle(@RequestParam("bookId") Integer bookId, 
          @RequestParam("previousTitle") String previousTitle, 
          @RequestParam("newTitle") String newTitle) { 

     Book book = bookRepository.findById(bookId); 
     book.setPreviousTitle(previousTitle); 
     book.setNewTitle(newTitle); 

     bookRepository.merge(book); 
    } 

} 

Où BookRepository peut être écrit comme

@Repository 
public class BookRepository extends AbstractRepository<Book, Integer> { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    public void merge(Book book) { 
     sessionFactory.getCurrentSession().update(book); 
    } 

} 

Si vous voulez, vous pouvez créer une commande personnalisée UpdateTitleUseCase classe qui encapsule les attributs previousTitle et newTitle. De cette façon, votre contrôleur ressemble à

@RequestMapping(method=RequestMethod.POST) 
public void updateTitle(UpdateTitleUseCase command) { 
    Book book = bookRepository.findById(command.getBookId()); 
    book.setPreviousTitle(command.getPreviousTitle()); 
    book.setNewTitle(command.getNewTitle()); 

    bookRepository.merge(book); 
} 
+0

+1 pour la manière printanière –

+0

@Pascal Thivent Merci, Pascal. Je suis à la recherche de vos réponses sur les tests unitaires, les tests, etc. –

+0

Vous trouverez quelques réponses, mais je n'ai pas vraiment posté beaucoup sur ce sujet (comment ça s'est passé en passant?). Mais mes jouets actuels incluent: [Arquillian] (http://jboss.org/arquillian) (pour l'intégration ou les tests fonctionnels de Java EE 6), [Concordion] (http://www.concordion.org/) pour BDD. –

Questions connexes