java - Hibernate:插入ManyToMany,在关系表中生成ID

标签 java hibernate jpa

让我有表格(书籍和作者有 ManyToMany 关系)

书籍
编号
书名

作者
编号
作者姓名

BOOKS_AUTHORS
编号
book_id
作者编号

我将这个表映射到实体上

class Books  
{  
   @Id  
   long id;  

  @Column(name = "author_name")
   String name;


   @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   @JoinTable(name = "BOOKS_AUTHORS", 
              joinColumns = @JoinColumn(name = "book_id"),
              inverseJoinColumns = @JoinColumn(name = "author_id"))  
   List<Authots> authors;  

// setter, getters, adder  
}  

class Authors  
{  
   @Id  
   long id;  

   @Column(name = "author_name")
   String name;

   @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   @JoinTable(name = "BOOKS_AUTHORS", 
              joinColumns = @JoinColumn(name = "author_id"),
              inverseJoinColumns = @JoinColumn(name = "book_id"))  
   List<Books> books;  

// setter, getters, adder  
}  

现在,我尝试下一步

public void addAuthor(final String bookName, final Author author)
{  
      final Book book = // get book from database by bookName
      if (book == null)
         throw new DataNotFoundException("Book not found :(");
      author.addBook(book);
      book.addAuthor(author);  
      entityManager.persist(author);  
}  

1) 我得到异常,BOOKS_AUTHORS 记录的 ID 必须不为 NULL
2) 我如何为关系表 BOOKS_AUTHORS 生成 ID(ising 序列生成器)

最佳答案

您不能使用 @ManyToMany 创建带有 id 字段的连接表。

如果连接表中的 id 字段是必需的,则必须为该表创建一个特殊的实体类(例如 BookAuthor),并使用 @ManyToOne 将其与书籍和作者连接/@OneToMany 关系。

否则,您需要从 BOOKS_AUTHORS 表中删除 id 字段。

关于java - Hibernate:插入ManyToMany,在关系表中生成ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10445970/

相关文章:

java - 如果我使用 EJB,我是否需要 JPA 提供程序(如 Hibernate)?

java - 未从 `resources` 目录中检测到文件

java - JNI 从 C 程序调用 Java 方法

java - 从 Arraylist 动态添加 View

hibernate - 未找到 Maven hibernate jar (3.5.1-Final)

java - JBoss 类加载器存储库

java - 将列表序列化为 JSON 数组

java - 单元测试在 Debug模式下成功,但在正常运行时失败

java - Hibernate 查询在忽略年份的日期获取记录

MySQL Connector/J 长时间运行的进程