使用Spring 4.1.7和Hibernate 4.3.10。
我正在尝试通过表单POST创建一个新的自定义Note
对象到Spring Controller。 Note对象包含Book
对象,使用Hibernate持久保存Note
和Book
。
表单POST到的Controller类:
@Controller
@RequestMapping(value = "/notes")
public class NoteRestController {
[...]
@RequestMapping(value = "/create", method = RequestMethod.POST)
public ModelAndView createForView(final Model model,
@ModelAttribute final Note note) {
/*-- DEBUG. works, but probably not ideal.
{
final Book validBook = daoService.retrieveBook(note.getBook()
.getId());
note.setBook(validBook);
}//*/
UUID createdNoteId = daoService.createNote(note);
model.addAttribute("note",
daoService.retrieveNote(createdNoteId));
return new ModelAndView("note/note");
}
}
Note
对象:
@Entity
@Table(name = "note")
public class Note {
@Id
@Column(name = "id", insertable = false, updatable = false)
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Type(type = "pg-uuid")
private UUID id;
@Column(name = "title")
private String title;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "book", referencedColumnName = "id")
private Book book;
[...]
}
Book
对象:
@Entity
@Table(name = "book")
public class Book {
@Id
@Column(name = "id", insertable = false, updatable = false)
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Type(type = "pg-uuid")
private UUID id;
@Column(name = "name")
private String name;
[...]
}
底层数据库(目前是Postgres 9.1)定义Book.name
列不是NULL。
我想要做的是使用Spring表单创建一个新的Note
,只需传入id
的唯一Book
(并将标题标题为String)。
我的测试HTML表单(为简洁起见,删除了页面格式):
<form:form method="post" id="create" action="/notes/create"
commandName="note">
<form:input type="text" id="title" name="title" path="title" />
<form:input type="text" id="book.id" name="book.id" path="book.id" value="" />
<input value="Create" type="submit" name="Create">
</form:form>
当我提交表单(book.id
中的有效值)时,控制器会在Book
设置Note
的情况下创建id
个实例,但是null name
字段。可以理解,因为我没有传递它,但我也不想每次传递它。
当我提交带有DEBUG块注释掉的表单时,会抛出有关null name
字段的异常。但是,如果我取消注释调试块(预取Book
并将其设置为Note
实例),一切正常。
有没有更好的方法可以在不手动获取嵌套对象的情况下执行此操作?最终,我打算在Note
中包含更多实体,并且我不想在创建Note
之前获取所有实体。
我希望这是有道理的!