Hi!
I try to build some application using hibernate for persistence (my first one). The application has genres and books. The genre class has a set of books. But every book in the set has the idGenre (the foreign key) value 0. I think the mapping is not right. Please tell me where is the mistake. Thanks.
Here is the mapping:
<hibernate-mapping package = "model">
<class name = "User" table="virtual_bookcase.users">
<id name = "id" column = "id" type = "long">
<generator class = "increment"/>
</id>
<property name = "username" column = "username" type = "string"/>
<property name = "password" column = "password" type = "string"/>
</class>
<class name = "Genre" table = "virtual_bookcase.genres">
<id name = "id" column = "idGenres" type = "long">
<generator class = "increment"/>
</id>
<property name = "name" column = "name" type = "string"/>
<set name = "books" table = "virtual_bookcase.books" cascade = "all-delete-orphan">
<key column = "idGenre" not-null = "true" />
<one-to-many class = "Book"/>
</set>
<many-to-one name = "user" class = "User" column = "user_id" />
</class>
<class name = "Book" table = "virtual_bookcase.books">
<id name = "id" column = "idBooks" type = "long">
<generator class = "increment"/>
</id>
<property name = "title" column = "title" type = "string"/>
<property name = "author" column = "author" type = "string"/>
<property name = "publisher" column = "publisher" type = "string"/>
<property name = "pages" column = "pages" type = "short"/>
<property name = "borrowed" column = "borrowed" type = "byte"/>
<property name = "borrowedTo" column = "borrowedTo" type = "string"/>
</class>
</hibernate-mapping>
Here is where i load the books:
Session s = sessionFactory.openSession();
Query q = s.createQuery("FROM Book WHERE idGenre = ?").setLong(0, g.getId());
books = new TreeSet<Book>(q.list());
Here is the Book class:
public class Book implements Comparable<Book>
{
private long id;
private String title;
private String author;
private String publisher;
private short pages;
private byte borrowed;
private String borrowedTo;
private long idGenre;
public Book(){}
public Book(String title, String author, String publisher, short pag, byte borrowed, String borrowedTo, long idGenre)
{
this.title = title;
this.author = author;
this.publisher = publisher;
this.pages = pag;
this.borrowed = borrowed;
this.borrowedTo = borrowedTo;
this.idGenre = idGenre;
}
public long getId()
{
return id;
}
public String getTitle()
{
return title;
}
public String getAuthor()
{
return author;
}
public String getPublisher()
{
return publisher;
}
public short getPages()
{
return pages;
}
public void setId(long id)
{
this.id = id;
}
public void setTitle(String title)
{
this.title = title;
}
public void setAuthor(String author)
{
this.author = author;
}
public void setPublisher(String publisher)
{
this.publisher = publisher;
}
public void setPages(short pages)
{
this.pages = pages;
}
public byte getBorrowed()
{
return borrowed;
}
public void setBorrowed(byte borrowed)
{
this.borrowed = borrowed;
}
public String getBorrowedTo()
{
return borrowedTo;
}
public void setBorrowedTo(String borrowedTo)
{
this.borrowedTo = borrowedTo;
}
public long getIdGenre()
{
return idGenre;
}
public void setIdGenre(long idGenre)
{
this.idGenre = idGenre;
}
@Override
public String toString()
{
return title;
}
@Override
public int compareTo(Book b)
{
if (this.title == b.getTitle() && this.author == b.getAuthor() && this.publisher == b.getPublisher() && this.pages == b.getPages())
return 0;
return 1;
}
}
Here is how i make a new instance of a Book:
Book b = new Book("AddedBook", "A", "A", (short) 555, (byte) 0, "", 1);
Genre g = ((Genre) cmbGenres.getSelectedItem());
g.addBook(b);
control.saveGenre(g);
And the saveGenre(g) method is (without initialisation of SessionFactory and session and transaction):
t = session.beginTransaction();
Genre gr = (Genre) session.merge(g);
t.commit();