Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 冬眠,坚持许多_Java_Spring_Hibernate_Persistence - Fatal编程技术网

Java 冬眠,坚持许多

Java 冬眠,坚持许多,java,spring,hibernate,persistence,Java,Spring,Hibernate,Persistence,我试图在一个与其他实体有多对多关系的实体中,将一个添加项持久化到列表中 我的数据库如下所示: CREATE TABLE book ( isbn VARCHAR(20) PRIMARY KEY NOT NULL, name VARCHAR(255)) ENGINE = InnoDB; CREATE TABLE author ( aid INT PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(100)) ENGI

我试图在一个与其他实体有多对多关系的实体中,将一个添加项持久化到列表中

我的数据库如下所示:

CREATE TABLE book (
    isbn VARCHAR(20) PRIMARY KEY NOT NULL, 
    name VARCHAR(255)) ENGINE = InnoDB;
CREATE TABLE author (
    aid INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100)) ENGINE = InnoDB;
CREATE TABLE aubo (
    aid INT NOT NULL,
    isbn VARCHAR(20),
    PRIMARY KEY (aid, isbn),
    FOREIGN KEY (aid) REFERENCES author(aid) ON DELETE RESTRICT ON UPDATE CASCADE,
    FOREIGN KEY (isbn) REFERENCES book(isbn) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE = InnoDB;
这些是实体,书籍:

@Entity
public class Book {
    private String isbn;
    private String name;
    private List<Author> authors;

    ....

    @javax.persistence.JoinTable(name = "aubo", catalog = "pwtest", schema = "", joinColumns =     @javax.persistence.JoinColumn(name = "isbn", referencedColumnName = "isbn", nullable = false), inverseJoinColumns = @javax.persistence.JoinColumn(name = "aid", referencedColumnName = "aid", nullable = false))
    @ManyToMany
    public List<Author> getAuthors() {
        return authors;
    }

    public void setAuthors(List<Author> authors) {
        this.authors = authors;
    }

    ....more including equals and hashcode
这就是我想做的:

Book book = bookDAO.getByID(isbn);
if(book == null) throw new IllegalArgumentException("Book id:"+isbn+" not found.");
Author author = authorDAO.getByID(Integer.parseInt(aid));
if(author == null) throw new IllegalArgumentException("Author id:"+aid+" not found.");

List<Author> authors = book.getAuthors();
authors.add(author);
author.getBooks().add(book);
Book Book=bookDAO.getByID(isbn);
如果(book==null)抛出新的IllegalArgumentException(“book id:+isbn+“未找到”);
Author=authorDAO.getByID(Integer.parseInt(aid));
如果(author==null)抛出新的IllegalArgumentException(“author id:“+aid+”未找到”);
List authors=book.getAuthors();
作者。添加(作者);
author.getBooks().add(book);
实体运行良好,我可以看到正确的作者列表以及正确的书籍和作者。问题是书中的作者列表(以及书中的作者列表)不会得到更新,不会引发任何异常


我哪里做错了?

您应该将
cascade
属性设置为
@manytomy
annotation


在多人批注中同时使用“持久化”和“合并”

@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })

我接受你们的回答,因为它让我觉得我并没有合并这本书,所以我按照你们的建议级联并使用了Spring的注解@Transactional。现在它正常工作了!
Book book = bookDAO.getByID(isbn);
if(book == null) throw new IllegalArgumentException("Book id:"+isbn+" not found.");
Author author = authorDAO.getByID(Integer.parseInt(aid));
if(author == null) throw new IllegalArgumentException("Author id:"+aid+" not found.");

List<Author> authors = book.getAuthors();
authors.add(author);
author.getBooks().add(book);
@ManyToMany(mappedBy = "authors", cascade= CascadeType.ALL)
public List<Book> getBooks() 
{
   return books;
}  
@ManyToMany(cascade= CascadeType.ALL)
public List<Author> getAuthors() 
{
   return authors;
}
em.merge(book);
@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })