代码之家  ›  专栏  ›  技术社区  ›  DaJackal

为什么外键的值总是零?

  •  0
  • DaJackal  · 技术社区  · 14 年前

    我尝试使用Hibernate for Persistence(我的第一个)构建一些应用程序。该应用程序有流派和书籍。流派班有一套书。但是,集合中的每本书都具有idStyle(外键)值0。我觉得地图不对。请告诉我哪里出错了。谢谢。

    以下是映射:

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

    我在这里装书:

    Session s = sessionFactory.openSession();
    
    Query q = s.createQuery("FROM Book WHERE idGenre = ?").setLong(0, g.getId());
    
    books = new TreeSet<Book>(q.list());
    

    这是书本课:

    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;
        }
    
    }
    

    以下是我如何制作一本书的新实例:

    Book b = new Book("AddedBook", "A", "A", (short) 555, (byte) 0, "", 1);
    Genre g = ((Genre) cmbGenres.getSelectedItem());
    g.addBook(b);
    control.saveGenre(g);
    

    savetyle(g)方法是(不初始化sessionFactory和session and transaction):

       t = session.beginTransaction();
       Genre gr = (Genre) session.merge(g);
       t.commit();
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Péter Török    14 年前

    Book Genre

    merge Genre.addBook

    Book.idGenre

    <class name = "Book" table = "virtual_bookcase.books">
        ...
        <many-to-one name="idGenre" column="idGenre" class="Genre" not-null="true"/>
    </class>
    

      <set name = "books" cascade = "all-delete-orphan">
        <key column = "idGenre"/>
        <one-to-many class = "Book"/>
      </set>
    

    long idGenre

    private Genre genre;