当前位置: 首页 > 知识库问答 >
问题:

保存相关对象

东门俊民
2023-03-14

我正在学习SpringJPA,我从将对象映射到表开始。我对OneToOne和OneToMany的关系没有问题,但我不太明白为什么我不能预先列出一个与许多关系相关的对象。我有一本可以有很多作者的书,还有一本可以有很多书的作者。通过中间表book_author正确生成模式(我可以在MySql Workbench中看到),但我得到以下示例:

Hibernate:在作者(名字、姓氏)中插入值(?,)

Hibernate:插入到书(种类,标题)值 (?, ?)

Hibernate:插入到书(种类,标题)值 (?, ?)

Hibernate:在author\u book(author\u id,book\u id)中插入值(?,)

Hibernate:在author\u book(author\u id,book\u id)中插入值(?,)

Hibernate:在作者(名字、姓氏)中插入值(?,)

线程“main”组织中出现异常。springframework。刀。InvalidDataAccessApiUsageException:传递给persist:com的分离实体。实例演示。模型。书嵌套的异常是org。冬眠PersistentObjectException:传递给persist:com的分离实体。实例演示。模型。书

我还粘贴了Hibernate操作,效果很好。

这些是我的实体定义:

@Table(name = "author")
public class Author {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String firstName;
    private String lastName;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.ALL})
    @JoinTable(
            name = "author_book",
            joinColumns = {@JoinColumn(name = "author_id")},
            inverseJoinColumns = {@JoinColumn(name = "book_id")}
            )
    private List<Book> books = new ArrayList<Book>();

    //getters and setters omitted for brevity
}

@Entity(name = "Book")
@Table(name = "book")
public class Book {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String kind;
    @ManyToMany(mappedBy = "books")
    private List<Author> authors = new ArrayList<Author>();

    //getters and setters omitted for brevity
}

这些是我的存储库:

@Repository
public interface AuthorRepository extends CrudRepository<Author, Long> {

}

@Repository
public interface BookRepository extends CrudRepository<Book, Long> {

}

最后,这是我的主要任务

public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
        AuthorRepository authorRepository = ctx.getBean(AuthorRepository.class);
        BookRepository bookRepository = ctx.getBean(BookRepository.class);

        Author author = new Author();
        author.setFirstName("Author");
        author.setLastName("First");

        Author author2 = new Author();
        author.setFirstName("Author");
        author.setLastName("Second");

        Book book1 = new Book();
        book1.setTitle("Book 1");
        book1.setKind("History");
        book1.getAuthors().add(author);
        book1.getAuthors().add(author2);

        Book book2 = new Book();
        book2.setTitle("Book 2");
        book2.setKind("Science");
        book2.getAuthors().add(author);

        author.getBooks().add(book1);
        author.getBooks().add(book2);
        author2.getBooks().add(book1);

        authorRepository.save(author);
        authorRepository.save(author2);

        System.out.println("-->End of db operation");

    }

共有2个答案

钱运浩
2023-03-14

Hibernate为对象维护3种状态:

  1. 瞬态:新创建的对象
  2. 持久性:当Hibernate保存对象时
  3. 分离:保存对象并关闭会话后

在您的情况下,authorRepository保存临时对象(author、book1和book2),并在保存后关闭会话。因此,在第一次调用save方法后,所有对象(author、book1和book2)都处于分离状态,这就是当您尝试保存author2时,Hibernate抛出分离实体异常的原因。您可以在本视频中找到更多信息https://www.youtube.com/watch?v=sjZGFHEdD4M

黄飞翮
2023-03-14

Author类中创建一个新方法来添加书籍,而不是使用Author。getBooks()。添加(第1册)

    public void addBook(Book book) {
        books.add(book);
        books.authors.add(this);
    }

而且您不应该使用CascadeType。全部,因为删除实体时,关系的另一端也会被删除

 类似资料:
  • p3=Place(name='Demon Dogs',address='944 W.Fullerton')restaurant.objects.create(Place=p3,serves_hot_dogs=true,serves_pizza=false) Traceback(最近调用为last): ... valueerror:save()禁止,以防止由于未保存的相关对象'Place'而丢失数据

  • 当我创建新的团队并试图将其关联到我的用户配置文件时,我发现这个错误正在显示。我想要一个团队,很多成员和只有一个创建者(或管理的团队),创建者也是小组的成员。如何将团队与用户配置文件关联? models.py views.py

  • 我有一个数据库(和模型)情况,如下模式所示: 这是ModelSerialize: 我将这个json发送到api方法 视图中我的post_create实现: 更新 现在我得到了这个错误:django.db.models.fields.related_descriptors.relatedObjectDoesNotexist:Post没有ID。 这些是我的模型: 类PostCategory(Model

  • 背景:对于我的用户,我需要存储一对相同的对象类型(设置),目前我有它像 我正在创建带有设置的KeyValueTypes,并将其添加到列表中(每个用户都有一个列表)。我的设置有一个值字段(它显示了它们是否比其他设置“更重要”),所以我希望基于该字段添加它们,稍后我还需要基于该字段(可能还需要基于名称字段)进行搜索--所以搜索将不得不在列表中查找,然后在KeyValueTypes中查找 问题:什么是最

  • 之前在文章中说到,Jsoup使用了一套自己的DOM对象体系,和Java XML API互不兼容。这样做的好处是从XML的API里解脱出来,使得代码精炼了很多。这篇文章会说明Jsoup的DOM结构,DOM的遍历方式。在下一篇文章,我会并结合这两个基础,分析一下Jsoup的HTML输出功能。 DOM结构相关类 我们先来看看nodes包的类图: 这里可以看到,核心无疑是Node类。 Node类是一个抽象

  • 正如官方文件所说: 有时,您可能不仅希望保存模型,还希望保存其所有关系。为此,您可以使用push方法:保存模型和关系$user- 术语表: term_id 姓名 鼻涕虫 Term_taxonomy表: term_taxonomy_id term_id 描述 我的学期模型: 我的术语分类模型: 我的分类控制器 用我上面的代码,我可以保存名称和段塞,但分类和描述没有插入。有可能吗? 谢谢,我是新来的。