0

我是休眠的新手,并尝试在数据库中写入数据。我的代码

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="postsess">
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.password">123456</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgis</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.default_schema">public</property>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
            <!-- Mapping files -->
    <mapping resource="net.sf.hibernate.examples.quickstart.Cat.hbm.xml"/>
</session-factory>
</hibernate-configuration>

HibernateUtin

package net.sf.hibernate.examples.quickstart;

 import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import net.sf.hibernate.*;
//import net.sf.hibernate.examples.quickstart.hibernate.cfg.xml;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
    try {
        // Create the SessionFactory
        sessionFactory = new Configuration().configure().buildSessionFactory();
    } catch (HibernateException ex) {
        throw new RuntimeException("Configuration problem: " + ex.getMessage(), ex);
    }
}

public static final ThreadLocal session = new ThreadLocal();

public static Session currentSession() throws HibernateException {
    Session s = (Session) session.get();
    // Open a new Session, if this Thread has none yet
    if (s == null) {
        s = sessionFactory.openSession();
        session.set(s);
    }
    return s;
}

public static void closeSession() throws HibernateException {
    Session s = (Session) session.get();
    session.set(null);
    if (s != null)
        s.close();
}
}

并获得例外

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" java.lang.ExceptionInInitializerError
at net.sf.hibernate.examples.quickstart.hib_main.main(hib_main.java:14)
Caused by: java.lang.RuntimeException: Configuration problem: Resource: net.sf.hibernate.examples.quickstart.Cat.hbm.xml not found
at net.sf.hibernate.examples.quickstart.HibernateUtil.<clinit>  (HibernateUtil.java:20)
... 1 more
 Caused by: org.hibernate.MappingException: Resource: net.sf.hibernate.examples.quickstart.Cat.hbm.xml not found
at org.hibernate.cfg.Configuration.addResource(Configuration.java:444)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1313)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1285)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1267)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1234)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1162)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1148)
at net.sf.hibernate.examples.quickstart.HibernateUtil.<clinit>(HibernateUtil.java:18)
... 1 more

我做错了什么。它再次尝试执行简单的示例并再次执行相同的异常。

更新

在更改映射文件的路径后,hibernate.cfg.xml我得到了另一个例外session.save(princess);

 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.id.IdentifierGenerationException: ids for  this class must be manually assigned before calling save(): net.sf.hibernate.examples.quickstart.Cat
at org.hibernate.id.Assigned.generate(Assigned.java:32)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:85)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:477)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:472)
at net.sf.hibernate.examples.quickstart.hib_main.main(hib_main.java:23)

Cat.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 15.08.2012 12:46:22 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="net.sf.hibernate.examples.quickstart.Cat" table="CAT">
    <id name="id" type="java.lang.String">
        <column name="cat_id" />
        <generator class="assigned" />
    </id>
    <property name="name" type="java.lang.String">
        <column name="name" />
    </property>
    <property name="sex" type="char">
        <column name="sex" />
    </property>
    <property name="weight" type="float">
        <column name="weight" />
    </property>
</class>
</hibernate-mapping>

和主课。

package net.sf.hibernate.examples.quickstart;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class hib_main
{

/**
 * @param args
 */
public static void main(String[] args)
{
    Session session = HibernateUtil.currentSession();

    Transaction tx= session.beginTransaction();

    Cat princess = new Cat();
    princess.setName("Princess");
    princess.setSex('F');
    princess.setWeight(7.4f);

    session.save(princess);
    tx.commit();

    HibernateUtil.closeSession();

}

}
4

4 回答 4

6

尝试以这种方式定义映射资源(使用“/”而不是“.”):

<mapping resource="net/sf/hibernate/examples/quickstart/Cat.hbm.xml"/>

我认为这是您的问题的原因。

更新:

关于您的第二个问题-我认为您忘记在 Cat.hbm.sql 中定义 id 生成策略。例如:

<id name="id" column="CREDIT_CARD_ID" type="long">
    <generator class="native"></generator>
</id>

更新 2:

Hibernate 使用它自己的类型。所以在 id 类型的声明中,你不应该使用 java.lang.String 或 java.lang.Integer,而应该使用简单的字符串和整数。例如,如果您想使用字符串 id,您应该将其定义为:

<id name="id" column="cat_id" type="integer">
    <generator class="native"/>
</id>

在这里你可以找到hibernate的映射类型列表。

于 2012-08-15T07:32:44.193 回答
2

你有两个hibernate.cfg.xml。所以删除一个hibernate.cfg.xml。尝试用下面的结构进行测试。资源映射对你来说并不麻烦。你只能这样声明

       <mapping resource="Cat.hbm.xml"/>

在此处输入图像描述

于 2012-08-15T07:46:47.307 回答
1

您应该/在路径前使用:

<mapping resource="/net/sf/hibernate/examples/quickstart/Cat.hbm.xml"/>
于 2012-08-15T07:34:40.357 回答
0

我会将 Cat.hbm.xml 重命名Cat_hbm_xml作为每个 ' ' 指的是一个子包

于 2012-08-15T07:38:11.717 回答