在Hibernate中持久化简单对象的问题

时间:2011-06-11 00:48:50

标签: java hibernate

我有以下Model类:

package com.swaranga.model;

public final class Book
{
    private Long id;
    private String title;
    private String isbn;

    public Book(){}

    public Book(String title, String isbn)
    {
        this.title = title;
        this.isbn = isbn;
    }

    public final Long getId(){
        return id;
    }

    private final void setId(Long id)
    {
        this.id = id;
    }


    public final String getTitle()
    {
        return title;
    }


    public final void setTitle(String title)
    {
        this.title = title;
    }


    public final String getIsbn()
    {
        return isbn;
    }


    public final void setIsbn(String isbn)
    {
        this.isbn = isbn;
    }
    //assume valid equals and hashcode
}

具有以下映射文件Book.hbm.xml:

<hibernate-mapping>

        <class name="com.swaranga.model.Book" table="book">
            <id name="id" type="long">
                <generator class="native"/>
            </id>

            <property name="title" column="title" type="string"/>

            <property name="isbn" column="isbn" type="string"/>
        </class>

</hibernate-mapping>

以下数据库架构:

    CREATE TABLE  `hibernatetest`.`book` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `title` varchar(45) NOT NULL,
      `isbn` varchar(45) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

以下hibernate配置文件:

<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver </property>          
        <property name="connection.url">jdbc:mysql://localhost:3306/HibernateTest </property>

        <property name="connection.username"> root </property>

        <property name="connection.password"> latitude </property>

        <property name="show_sql">true</property>

        <property name="dialect">org.hibernate.dialect.MySQLDialect </property>

        <property name="myeclipse.connection.profile">mysql</property>

        <mapping resource="com\swaranga\model\Book.hbm.xml" />
    </session-factory>
</hibernate-configuration>

最后使用以下代码来保留Book对象:

public class Main
{
    public static void main(String[] args)
    {
        File f = new File("hibernate.cfg.xml");     
        Configuration cfg = new Configuration();
        SessionFactory sessionFactory = cfg.configure(f).buildSessionFactory();     
        Session s = sessionFactory.openSession();       
        s.beginTransaction();       
        s.save(new Book("JDBC", "ISBN_!@#"));       
        s.flush();      
        s.disconnect();
    }
}

我在控制台中收到以下输出:

Hibernate: insert into book (title, isbn) values (?, ?)

但是当我检查我的数据库时,没有条目。

对这么长的问题抱歉,但我认为有必要提供所有细节。请帮忙。提前谢谢。

4 个答案:

答案 0 :(得分:3)

尝试将main方法的结尾编辑为:

Transaction tx = s.beginTransaction();       
s.save(new Book("JDBC", "ISBN_!@#"));       
tx.commit();
s.flush();      
s.disconnect();

答案 1 :(得分:0)

“auto”是一个有效的生成器类吗?

它没有在文档的O / R映射部分列出,并且从你看起来的样子开始,你没有在代码或数据库中生成ID:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html

如果你想分配id,我会查看native,或者让一个身份生成器让MySQL处理它。

答案 2 :(得分:0)

您是否尝试过ID“long”?

答案 3 :(得分:0)

您尚未将数据库的ID设置为自动递增。试试吧。应该工作。