5

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


id book_name

作者
id
author_name

BOOKS_AUTHORS
id
book_id
author_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(序列生成器)

4

4 回答 4

12

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

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

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

于 2012-05-04T09:22:24.807 回答
1
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;

如果books_authors没有使用 Hibernate 映射,则使用数据库端自动 id 增量器。例子:

ALTER table book_authors CHANGE id long NOT NULL AUTO_INCREMENT;
于 2012-05-04T09:19:44.190 回答
0

尝试使用投影

                  session.CreateCriteria(typeof (BOOKS_AUTHORS))
                           .SetProjection(Projections.Max("Id"))
                           .UniqueResult()

并添加到它+1 :) 对不起它的.net 代码我不熟悉java 希望它会帮助你。

于 2012-05-04T09:27:47.560 回答
0

SpringBoot 1.5.3spring-boot-starter-data-jpa中,您可以使用 annotation {@OrderColumn(name = "id")}。对于你的例子,它应该看起来像:

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
       @JoinTable(name = "BOOKS_AUTHORS", 
          joinColumns = @JoinColumn(name = "author_id"),
          inverseJoinColumns = @JoinColumn(name = "book_id")) 
    @OrderColumn(name = "id")             
    List<Books> books; 
于 2017-09-21T11:22:05.777 回答