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 :)