具有嵌套实体的Spring / Hibernate持久化实体(仅通过嵌套实体id /主键)

时间:2015-07-21 04:38:25

标签: java hibernate spring-mvc

使用Spring 4.1.7和Hibernate 4.3.10。

我正在尝试通过表单POST创建一个新的自定义Note对象到Spring Controller。 Note对象包含Book对象,使用Hibernate持久保存NoteBook

表单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之前获取所有实体。

我希望这是有道理的!

0 个答案:

没有答案