Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带嵌套实体的Spring/Hibernate持久实体(仅按嵌套实体id/主键)_Java_Hibernate_Spring Mvc - Fatal编程技术网

Java 带嵌套实体的Spring/Hibernate持久实体(仅按嵌套实体id/主键)

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

使用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 = "/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
,但字段为空。可以理解,因为我不想每次都通过,但我也不想每次都通过

当我提交带有注释掉的调试块的表单时,会抛出一个关于null
name
字段的异常。但是,如果我取消对debug块的注释(它预取
书籍
,并将其设置为
注释
实例),一切都会正常工作

有没有更好的方法可以在不手动获取嵌套对象的情况下执行此操作?最终,我打算在
Note
中拥有更多实体,我不想在创建
Note
之前获取所有实体


我希望这是有意义的

从概念上考虑一下<代码>注意与本书有一定的关系。它必须有一本书,然后你才能根据这个设计坚持它(这似乎是正确的设计)。传递给
createForView
Note
对象应该已经有一本书了。这意味着调用者确实需要处理这个完整性。