我有以下作者类:
@Entity
public class Author implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(
name="author_book",
joinColumns = @JoinColumn( name="author_id"),
inverseJoinColumns = @JoinColumn( name="book_id")
)
private Set<Book> books= new HashSet<Book>();
public Author() {
super();
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
}
@Entity
public class Book implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
public Book() {
super();
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
public interface BookRepository extends CrudRepository<Book, Long> {
}
public interface AuthorRepository extends CrudRepository<Author, Long>{
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class AuthorRepositoryIntegrationTests {
@Autowired
AuthorRepository authorRepository;
@Autowired
BookRepository bookRepository;
@Test
@Transactional
public void deleteBookFromAuthor() {
Book book= new Book();
Author author= new Author();
author.getBooks().add(book);
author=this.authorRepository.save(author);
Iterable<Author> authors = this.authorRepository.findAll();
author=authors.iterator().next();
book=author.getBooks().iterator().next();
this.bookRepository.delete(book);
authors = this.authorRepository.findAll();
assertEquals(authors.iterator().next().getBooks().size(),0);
}
}
我的问题是这个测试用例中的最后一个断言失败了。如果我向作者添加一本书,它就会自动添加到图书存储库中。但是如果我从存储库中移除一本书,我如何从作者那里移除它呢?
好吧,对不起,我没有仔细看你的问题。答案很简单,这次我真的尝试了。您需要从POJO中的父级中删除子级,并在没有子级的情况下重新保存父级。请参阅下面的注释代码:
List<Book> books = new ArrayList<Book>();
Book book = new Book();
books.add(book);
Author author = new Author();
author.setBooks(books);
authorRepository.save(author);
Author a =authorRepository.findAll().iterator().next();
Book b = a.getBooks().get(0);
bookRepository.delete(b);
// REMOVE FROM PARENT
a.getBooks().remove(0);
authorRepository.save(a);
a = authorRepository.findAll().iterator().next();
System.out.println(a);
编辑:如果您担心一致性(应该如此),只需从author POJO中删除这本书,保存author时,cascade=cascadeType.all
将为您传播删除这本书。例如:
Author a =authorRepository.findAll().iterator().next();
a.getBooks().remove(0);
authorRepository.save(a);
// NO BOOK
a = authorRepository.findAll().iterator().next();
System.out.println(a);
我目前正在阅读Hibernate关于实体关联的文档,我遇到了一些问题。它本质上与和关联之间的区别有关。尽管我在实际项目中使用过它们,但我无法完全理解它们之间的区别。根据我的理解,如果一个表/实体与另一个表或实体有关联,那么该关联应该来自另一方。那么,我们应该如何根据具体案例决定选择哪一个,以及它对数据库/查询/结果有何影响?到处都有好榜样吗? PS:我认为这将很有帮助,因为它与这个问题有关,如果有
问题内容: 我有一个使用软删除的简单架构(这是设计方式,不能更改)。有参与模式两个表:和其中ofcourse是一个FK的表。规则是: 如果有,那么所有提到该公司的人都应该有。 但是,即使父母有,也可能有。 我的两个问题是:a)如何强制执行这些约束?b)如何最轻松地确保在软删除a时将其级联。 我添加了标签postgresql和sql server,因为它们是我最感兴趣的数据库。如果其他rdbms:e
我试着在这里找到类似的问题,我在这里找到了这个,但它没有太大的帮助。 这正是我的问题所在。问题是@ondelete迫使我建立双向关系,对吗?如果可能的话,我想保持单向性。 L.E:我修改了我的处理程序方法,看起来像这样
我正在使用Spring MVC/Security/JPA/Hibernate开发一个web应用程序。 我有一个用户类,它与UserRole有一个omany关系。 UserRole类与用户之间有很多关系。 用户存储库界面非常简单。 当我使用下面的代码片段使用存储库加载用户信息时,它会很好地检索用户和用户角色数据。 这是日志文件。 然而,问题出在这里。 如果我使用UserRepository的save
问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认
我在删除联接表中引用的实体时遇到问题。以下是三个链接的enitie。 当我尝试使用CrudRepository从来宾表中删除来宾时,它会给我这个错误。 错误:表“guest”上的更新或删除违反了表“guest\u group\u join”上的外键约束“FKKOUGVMCU860MOUACR1SHJXY”。键(id)=(4)仍然从表“guest\u group\u join”中引用。 有人能帮忙吗