java - 如何正确地将对象(带有集合)绑定(bind)到Spring Forms?

标签 java spring forms hibernate spring-mvc

我正在创建一个 Spring MVCHibernateJSPSpring Forms .

注释看起来像这样:

BookDescriptions.class

@Id
@Column(name = "isbn", unique = true, nullable = false)
private String isbn;

private String title;
private String description;
private String price;
private String publisher;
private String pubDate;
private String edition;
private String pages;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "BookAuthorsBooks", joinColumns = { @JoinColumn(name = "isbn") }, inverseJoinColumns = {
        @JoinColumn(name = "authorId") })
private Set<BookAuthors> bookAuthors;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "BookCategoriesBooks", joinColumns = { @JoinColumn(name = "isbn") }, inverseJoinColumns = {
        @JoinColumn(name = "categoryId") })
private Set<BookCategories> bookCategories;

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "BookStocksBooks", joinColumns = { @JoinColumn(name = "isbn") }, inverseJoinColumns = {
        @JoinColumn(name = "stockId") })
private BookStocks bookStock;

BookStocks.class

@Id
private String stockId;
private int stock;
private Date listedDate = new Date(123L);

BookAuthors.class

@Id
@Column(name = "authorid", unique = true, nullable = false)
private String authorId;

private String nameF;

private String nameL;

BookCategories.class

@Id
@Column(name = "categoryid", unique = true, nullable = false)
private int categoryId;

private String categoryName;

所以BookDescriptions.class是父表,并且使用 Join Table 与其他表有关系。 s。

我正在尝试通过这样的表单来操作数据库中的数据:

<c:forEach items="${bookDescriptions}" var="description">
            <tr>
                <form:form method="POST" action="updateStock"
                    modelAttribute="updatedStock">
                    <form:hidden path="isbn" value="${description.getIsbn()}" />
                    <form:hidden path="title" value="${description.getTitle()}" />
                    <form:hidden path="price" value="${description.getPrice()}" />
                    <form:hidden path="description"
                        value="${description.getDescription()}" />
                    <form:hidden path="publisher"
                        value="${description.getPublisher()}" />
                    <form:hidden path="pubDate"     value="${description.getPubDate()}" />    
                    <form:hidden path="edition"     value="${description.getEdition()}" />    
                    <form:hidden path="pages"     value="${description.getPages()}" />
                    <form:hidden path="bookAuthors"
                        value="${description.getBookAuthors()}" />
                    <form:hidden path="bookCategories"
                        value="${description.getBookCategories()}" />
                    <form:hidden path="bookStock"
                        value="${description.getBookStock()}" />
                    <form:hidden path="bookStock.stockId"
                          value="${description.getBookStock().getStockId()}" />

                    <td><c:out value="${description.getIsbn()}" /></td>
                    <td><c:out value="${description.getTitle()}" /></td>
                    <td><c:out value="${description.getBookStock().getStock()}" /></td>

                    <td><form:input path="bookStock.stock"
                                value="${description.getBookStock().getStock()}"></form:input></td>
                    <td><input type="submit" value="Save" /></td>
                </form:form>
            </tr>
        </c:forEach>

在这种情况下它有效。我可以成功地操纵股票,但似乎我错过了将对象绑定(bind)到 Spring Forms 的正确方法。因为操纵 BookDescription.class 中的数据使用以下形式无法按预期工作:

<c:forEach items="${bookDescriptions}" var="description">
            <tr>
                <form:form method="POST" action="updateStock"
                    modelAttribute="updatedBookDescription">
                    <td><form:input path="isbn" value="${description.getIsbn()}" /></td>
                    <td><form:input path="title"
                            value="${description.getTitle()}" /></td>
                    <td><form:input path="description"
                            value="${description.getDescription()}" /></td>
                    <td><form:input path="publisher"
                            value="${description.getPublisher()}" /></td>
                    <td><form:input path="price"
                            value="${description.getPrice()}" /></td>
                    <td><form:input path="pubDate"
                            value="${description.getPubDate()}" /></td>
                    <td><form:input path="edition"
                            value="${description.getEdition()}" /></td>
                    <td><form:input path="pages"
                            value="${description.getPages()}" /></td>
                    <td><form:input path="bookAuthors"
                            value="${description.getBookAuthors()}" /></td>
                    <td><form:input path="bookCategories"
                            value="${description.getBookCategories()}" /></td>
                    <td><form:input path="bookStock"
                            value="${description.getBookStock()}" /></td>

                    <form:hidden path="bookStock.stockId"
                        value="${description.getBookStock().getStockId()}" />
                    <form:hidden path="bookStock.stock"
                        value="${description.getBookStock().getStock()}" />


                    <td><input type="submit" value="Save" /></td>
                </form:form>
            </tr>
        </c:forEach>

问题如下:操作 BookDescription.class 中的数据不只是更新条目,而是删除旧条目并创建新条目。在此过程中,连接表中的条目将被删除并且不会重新输入。 看起来像Spring Forms无法绑定(bind)<form:hiddenpath="bookAuthors" value="${description.getBookAuthors()}" /> .

我的 Controller 如下所示:

@RequestMapping(value = "/admin", method = { RequestMethod.GET, RequestMethod.POST })
public String adminPane(Model model) {

    List<BookDescriptions> resultList = bookDescriptionsDaoImpl.getAllEntries();
    model.addAttribute("bookDescriptions", resultList);
    model.addAttribute("updatedStock", new BookDescriptions());
    model.addAttribute("updatedBookDescription", new BookDescriptions());

    return "admin";
}

数据输入如下:

public void update(BookDescriptions bookDescription) {

    if (this.entityManager.getTransaction().isActive()) {
        this.entityManager.getTransaction().rollback();
    }
    this.entityManager.getTransaction().begin();
    this.entityManager.merge(bookDescription);
    this.entityManager.flush();
    this.entityManager.getTransaction().commit();

}

此刻我有点绝望,因为我怀念 Hibernate 的经历。和Spring MVC并且不再知道在哪里寻找问题/解决方案,因此我将非常感谢关键字、解决方案或进一步阅读的链接。 我认为我走在完全错误的道路上。

提前谢谢您!

更新: 我正在使用 persistence.xml它看起来像这样:

<persistence-unit name="test-jpa" transaction-type="RESOURCE_LOCAL">
    <properties>
        <property name="hibernate.connection.driver_class" value="org.h2.Driver"></property>
        <property name="hibernate.connection.url" value="jdbc:h2:tcp://localhost/~/test"></property>
        <property name="hibernate.connection.username" value="sa"></property>
        <property name="hibernate.connection.password" value=""></property>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"></property>
        <property name="hibernate.hbm2ddl.auto" value="update"></property>
        <property name="hibernate.show_sql" value="true"></property>
    </properties>
</persistence-unit>

最佳答案

尝试在代码中使用 saveOrUpdate(...);update(..),如下所示:

public void update(BookDescriptions bookDescription) {

if (this.entityManager.getTransaction().isActive()) {
    this.entityManager.getTransaction().rollback();
}
this.entityManager.getTransaction().begin();
this.entityManager.update(bookDescription);
this.entityManager.getTransaction().commit();

}

或者

public void update(BookDescriptions bookDescription) {

if (this.entityManager.getTransaction().isActive()) {
    this.entityManager.getTransaction().rollback();
}
this.entityManager.saveOrUpdate(bookDescription);
}

关于java - 如何正确地将对象(带有集合)绑定(bind)到Spring Forms?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34066100/

相关文章:

spring - 有没有一种方法可以重新加载 Spring Boot 应用程序而无需在 STS 上重新运行应用程序?

java - 为什么不可能测试 boolean 值以外的任何东西?

java - 无法在多模块项目中正确打包 Spring Boot 应用程序

java - spring可以支持多应用共享成员(member)吗?

html - 将一个段落元素移动到另一个段落元素旁边

php - mySQL 从 PHP 表单添加到数据库时出现语法错误

java - Eclipse:更改工作区中所有项目的 JDK

java - 将图像移动到 JFrame 上单击的光标位置

java - 有没有一种方法可以覆盖 JLabel 的内容

javascript - 为什么我的 form.action 与表单提交的不同?