配Hibernate会遇到的常见问题

配置代码如下:

oracle sql:
--创建表空间
CREATE TABLESPACE shiningjade --指定表空间名
DATAFILE 'D:\SHININGJADE.DBF' --指定表空间文件位置和文件名
SIZE 50M --初始大小
AUTOEXTEND ON --自增开关
NEXT 50M --自增大小
MAXSIZE UNLIMITED; --限制大小
COMMIT;

--创建用户指定默认表空间
CREATE USER sj IDENTIFIED BY 123456  --创建用户名并指定密码
DEFAULT TABLESPACE shiningjade --用户的默认表空间
TEMPORARY TABLESPACE TEMP; --临时表空间
COMMIT;

--用户授权
GRANT DBA,CONNECT,CREATE SESSION, CREATE SEQUENCE,CREATE PROCEDURE,EXECUTE ANY PROCEDURE,CREATE TABLE TO sj;
COMMIT;


--首先创建一个表

CREATE TABLE document_type
(    
   id INTEGER CONSTRAINT document_type_pk PRIMARY KEY NOT NULL,    
   name VARCHAR2(30) NOT NULL
);
COMMIT;

--然后创建一个序列
CREATE SEQUENCE sq_document_type;
COMMIT; 

--为表创建触发器,每次插入前序列自增1
CREATE TRIGGER tg_document_type
BEFORE INSERT ON document_type
FOR EACH ROW
BEGIN    
  SELECT sq_document_type.nextval INTO :NEW.id from dual;
END  tg_document_type;
COMMIT; 

--插入数据测试

INSERT INTO document_type(name) values('身份证');
INSERT INTO document_type(name) values('假证');
INSERT INTO document_type(name) values('老年证');
INSERT INTO document_type(name) values('游园证');
INSERT INTO document_type(name) values('党员证');
INSERT INTO document_type(name) values('结扎证');
COMMIT;

查询结果
select * from document_type ORDER BY id;
        ID NAME                         
---------- ------------------------------
         1 身份证                          
         2 假证                           
         3 老年证                          
         4 游园证                          
         5 党员证                          
         6 结扎证


注:如果在创建触发器时报错提示--NEW 或 OLD 引用不允许在表级触发器中,表示你忘记写FOR EACH ROW 关键字了


Java代码
实体类
package hibernate;

import java.math.BigDecimal;

public class DocumentType implements java.io.Serializable {

	private static final long serialVersionUID = -3323030831848684918L;
	private BigDecimal id;
	private String name;
	public DocumentType() {
	}
	public DocumentType(BigDecimal id, String name) {
		this.id = id;
		this.name = name;
	}
	public BigDecimal getId() {
		return this.id;
	}

	public void setId(BigDecimal id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

实体类的xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping package="hibernate">
    <class name="DocumentType" table="DOCUMENT_TYPE" schema="SJ">
        <id name="id" type="java.math.BigDecimal">
            <column name="ID" precision="38" scale="0" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="30" not-null="true" />
        </property>
    </class>
</hibernate-mapping>




HibernateSessionFactory
package hibernate;

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

public class HibernateSessionFactory {

    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private  static Configuration configuration = new AnnotationConfiguration();    
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;

	static {
    	try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			System.err
					.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
    }
    private HibernateSessionFactory() {
    }
	
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				rebuildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession()
					: null;
			threadLocal.set(session);
		}

        return session;
    }
    
	public static void rebuildSessionFactory() {
		try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			System.err
					.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}

    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

	public static org.hibernate.SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public static void setConfigFile(String configFile) {
		HibernateSessionFactory.configFile = configFile;
		sessionFactory = null;
	}

	public static Configuration getConfiguration() {
		return configuration;
	}

}

最重要的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>
		<property name="current_session_context_class">thread</property><!--写错引起错误6 -->
		<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
		<property name="connection.url">jdbc:oracle:thin:localhost:1521:orcl</property>
		<property name="connection.username">sj</property>
		<property name="connection.password">123456</property>
		<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
                <property name="show_sql">true</property>
                <property name="hbm2ddl.auto">update</property>
                <property name="connection.pool_size">1</property>
                <mapping resource="hibernate/DocumentType.hbm.xml"/><!--写错引起错误8 -->
	</session-factory>
</hibernate-configuration>





测试类

package hibernate;

import org.hibernate.Session;

public class DocManager {

	public static void main(String[] args) {
		DocManager manager = new DocManager();
		manager.createAndStoreEvent("陪同证");
		HibernateSessionFactory.getSessionFactory().close();

	}
	
	
	private void createAndStoreEvent(String name){
		Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
		session.beginTransaction();//不写引起错误7
		DocumentType doc = new DocumentType();
		doc.setName(name);
		session.save(doc);
		session.getTransaction().commit();
	}

}




1、SLF4J: Failed to load class

Hibernate需要用日志功能记录日常活动,虽然提供了slf4j-api-1.x.x.jar但需要实现类的jar包

一般项目都用log4j,所以这里需要一个slf4j-log4j12-1.x.xx.jar

完整的slf4j下载地址:http://www.slf4j.org/download.html里面有各种实现


2、java.lang.NoClassDefFoundError:org.apache.log4j.Level

上面用了slf4j-log4j12-1.x.xx.jar包后自然需要log4j的jar包

下载地址:http://logging.apache.org/log4j/


3、Please initialize the log4j system properly.

需要log4j的资源文件log4j.properties

内容大概如下

log4j.rootLogger=warn, Console

log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=(%r ms) [%t] %-5p: %c#%M %x: %m%n

log4j.logger.com.genuitec.eclipse.sqlexplorer=DEBUG
log4j.logger.org.apache=WARN
log4j.logger.net.sf.hibernate=WARN


4、java.lang.NoClassDefFoundError: javax/persistence/EntityListeners

两种解决方法:

1、导入Hibernate提供的jpa包hibernate-jpa-2.0-api-1.0.1.Final.jar,在hibernate完整压缩包中肯定有

2、导入ejb3-persistence.jar


5、Could not obtain connection metadata java.sql.SQLException: 不支持的特性

去官网下载最新的jdbc驱动包,ojdbc14.jar

搜索ojdbc14.jar就行了


6、No CurrentSessionContext configured!

这个错误是由配置文件引起。在集成Hibernate的环境下(例如Jboss),在session-factory段加入:

<property name="Hibernate.current_session_context_class">jta</property>

在不集成Hibernate的环境下(例如使用JDBC的独立应用程序),在session-factory段加入:

<property name="Hibernate.current_session_context_class">thread</property>
另外property属性之间不要换行


7、save is not valid without active transaction

取出来的session似乎没有执行下面的语句

Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
session.beginTransaction();//这一句要执行,下面commit才不会报错

8、org.hibernate.MappingException: Unknown entity:

没有在session-factory里配mapping,mapping里的resource写成别的了

<mapping resource="hibernate/DocumentType.hbm.xml"/>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值