我正在创建一个 Spring MVC
与 Hibernate
和JSP
和Spring 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/