配置代码如下:
--创建表空间
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 关键字了
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 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;
}
}
<?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"/>