2012-05-04 1 views
4

Que je tableaux (livres et auteurs ont navire relation ManyToMany)Mise en veille prolongée: insérez ManyToMany, générer ID dans le tableau de la relation

LIVRES
id
book_name

AUTEURS
id
auteur_name

BOOKS_AUTHORS
id
book_id
AUTHOR_ID

I Carte Esta Tableaux sur les entités

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 
} 

Maintenant, j'essaie faire ensuite

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) Je reçois exception ID L'enregistrement BOOKS_AUTHORS ne doit pas être NULL
2) Comment je c Générer un ID (iste générateur de sequance) pour BOOKS_AUTHORS-table de relation

Répondre

11

Vous ne pouvez pas utiliser @ManyToMany pour créer table de jointure avec le champ id en elle.

Si le champ id dans la table de jointure est une exigence, vous devez créer une classe d'entité spéciale (comme BookAuthor) pour cette table et le connecter avec des livres et des auteurs avec @ManyToOne/@OneToMany relations.

Sinon, vous devez supprimer le champ id du tableau BOOKS_AUTHORS.

1
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private long id; 

Si books_authors n'est pas mappée en utilisant Hibernate, utilisez le côté de la base de données incrémenteur identifiant automatique. Exemple:

ALTER table book_authors CHANGE id long NOT NULL AUTO_INCREMENT; 
+0

De cette façon, je peux générer un ID pour l'entité Auteur et pour l'entité Livre. Mais j'ai besoin de générer un ID pour la table BOOKS_AUTHORS, qui n'est pas mappée – Ilya

+0

Voir la version éditée de ma réponse, book_authors a besoin de son incrément auto id au niveau db. – Bitmap

0

Essayez d'utiliser Projection

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

et y ajouter +1 :) Sory son code .net je ne suis pas familier avec java espérons que cela vous aidera.

0

Dans SpringBoot 1.5.3 et printemps-boot-démarreur-data-JPA vous pouvez utiliser l'annotation {@OrderColumn(name = "id")}. Pour votre exemple, cela devrait ressembler à:

@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; 
Questions connexes