Hej
Przez weekend starałem się uporządkować moją wiedzę na temat Hibernate. Stworzyłem sobie klasyczną relację wiele do wielu na przykładzie Book <-> Author.
W moim przykładzie encją "own"-owaną jest: Author, a encją która "own"-uje: Book.
Problem mój polega na tym jak zmusić hibernate, aby obiekt Autor "zapisał" obiekty typu "Books". W drugą stronę działa tzn. Obiekt Book jest w stanie zapisać obiekty typu Author. Kombinowałem z CASCADE. Proszę o wskazówki. Oto mój kod:
@Entity
@Table(name = "BOOKS")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "NAME")
private String name;
@ManyToMany(fetch = FetchType.LAZY, targetEntity = Author.class, cascade = {CascadeType.ALL})
@JoinTable(name = "AUTHOR_BOOK_RELATIONS", joinColumns = {@JoinColumn(name="BOOK_ID")}, inverseJoinColumns = {@JoinColumn(name="AUTHOR_ID")})
private List<Author> authors = new ArrayList<Author>();
public Book(){
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Author> getAuthors() {
return authors;
}
public void setAuthors(List<Author> authors) {
this.authors = authors;
}
}
@Entity
@Table(name = "AUTHORS")
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "NAME")
private String name;
@ManyToMany(fetch = FetchType.LAZY, targetEntity = Book.class, mappedBy = "authors", cascade = {CascadeType.ALL})
private List<Book> books = new ArrayList<>();
public Author(){
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session s = sessionFactory.openSession();
Transaction t = s.beginTransaction();
Author fisrtAuthor = new Author();
fisrtAuthor.setName("First Author");
s.save(fisrtAuthor);
Book firstBook = new Book();
firstBook.setName("First Book");
firstBook.getAuthors().add(fisrtAuthor); // To działa
s.save(firstBook);
Book secoundBook1 = new Book();
secoundBook1.setName("Secound Book");
s.save(secoundBook1);
Author secoundAuthor1 = new Author();
secoundAuthor1.setName("Secound Author");
secoundAuthor1.getBooks().add(secoundBook1); // To nie działa
s.save(secoundAuthor1);
t.commit();
s.close();
sessionFactory.close();
Dzięki za pomoc :)