Java 带嵌套实体的Spring/Hibernate持久实体(仅按嵌套实体id/主键)
使用Spring 4.1.7和Hibernate 4.3.10 我正试图通过一个到Spring控制器的表单POST来创建一个新的自定义Java 带嵌套实体的Spring/Hibernate持久实体(仅按嵌套实体id/主键),java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,使用Spring 4.1.7和Hibernate 4.3.10 我正试图通过一个到Spring控制器的表单POST来创建一个新的自定义Note对象。Note对象包含一个Book对象,使用Hibernate保存Note和Book 表单发布到的控制器类: @Controller @RequestMapping(value = "/notes") public class NoteRestController { [...] @RequestMapping(value = "/cr
Note
对象。Note对象包含一个Book
对象,使用Hibernate保存Note
和Book
表单发布到的控制器类:
@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");
}
}
注释
对象:
@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;
[...]
}
@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;
[...]
}
书籍
对象:
@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;
[...]
}
@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
列不为空
我想做的是使用Spring表单创建一个新的注释
,只需传入书籍
的唯一id
(注释标题为字符串)
我的测试HTML表单(为简洁起见,删除了页面格式):
当我提交表单时(使用book.id
中的有效值),控制器在Note
中创建一个book
实例,设置了id
,但字段为空。可以理解,因为我不想每次都通过,但我也不想每次都通过
当我提交带有注释掉的调试块的表单时,会抛出一个关于nullname
字段的异常。但是,如果我取消对debug块的注释(它预取书籍
,并将其设置为注释
实例),一切都会正常工作
有没有更好的方法可以在不手动获取嵌套对象的情况下执行此操作?最终,我打算在Note
中拥有更多实体,我不想在创建Note
之前获取所有实体
我希望这是有意义的 从概念上考虑一下<代码>注意与本书有一定的关系。它必须有一本书,然后你才能根据这个设计坚持它(这似乎是正确的设计)。传递给
createForView
的Note
对象应该已经有一本书了。这意味着调用者确实需要处理这个完整性。