【问题标题】:update table using spring mvc web and hibernate使用spring mvc web和hibernate更新表
【发布时间】:2010-10-01 10:11:47
【问题描述】:

我有一个简单的 spring mvc web 应用程序,可以处理简单的书店。我在更新现有图书时遇到问题。

我想更新一本书的标题。 我的 updateBook.jsp 是这样的。

<form method="post" action="">
    Previous book title : <input type="text" name="previousTitle" /> <br>
    New book title :<input type="text" name="newTitle"/><br>
    <input type="submit" name="update" value="update"/>
</form>

问题:我有 java 类,“UpdateBookController”来处理书的更新。 如何处理“UpdateBookController”类中的旧书名和新书名。

有什么想法吗?

提前致谢!

【问题讨论】:

    标签: java hibernate spring spring-mvc


    【解决方案1】:

    Spring 3.0 方式

    @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);
        }
    
    }
    

    BookRepository 可以写成的地方

    @Repository
    public class BookRepository extends AbstractRepository<Book, Integer> {
    
        @Autowired
        private SessionFactory sessionFactory;
    
        @Override
        public void merge(Book book) {
            sessionFactory.getCurrentSession().update(book);
        }
    
    }
    

    如果你愿意,你可以创建一个自定义的 UpdateTitleUseCase 命令类封装了 previousTitle 和 newTitle 属性。这样,您的控制器看起来像

    @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);
    }
    

    【讨论】:

    • @Pascal Thivent 谢谢你,帕斯卡。我正在寻找有关单元测试、测试等方面的答案...
    • 你会找到一些答案,但我并没有真正广泛地发布关于这个主题的文章(顺便说一下你的演讲怎么样?)。但我目前的玩具包括:Arquillian(用于 Java EE 6 的集成或功能测试),Concordion 用于 BDD。
    • @Pascal Thivent 感谢您的链接
    【解决方案2】:

    这样的事情怎么样:

    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());
    }
    

    但是,您可能希望使用 DAO 模式以简洁的方式处理此问题。

    【讨论】:

    • 使用 Spring 的全部意义在于您可以跳过所有这些样板代码。见这里:static.springsource.org/spring/docs/3.0.x/…
    • 是的,我知道,但最初问题中并没有详细说明,所以我只是对进行更新所涉及的步骤进行了非常基本的概述。当然,您可以使用事务管理器之类的东西,但这不是我认为问题的重点......
    猜你喜欢
    • 1970-01-01
    • 2017-03-14
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2013-02-19
    相关资源
    最近更新 更多