它不是保存我的对象,而是在达到保存方法时启动一个问题。
您可以在控制台中看到:
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.lang.NullPointerException
at com.liveSpreaker.presentation.HibernateTest.<init>(HibernateTest.java:58)
at com.liveSpreaker.presentation.HibernateTest.main(HibernateTest.java:65)
我的 bean 喜欢:
package com.live.beans;
public class User {
private int id;
private String Name;
private String email;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(int id, String name, String email, String password) {
super();
this.id = id;
Name = name;
this.email = email;
this.password = password;
}
public User(String name, String email, String password) {
super();
Name = name;
this.email = email;
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", Name=" + Name + ", email=" + email
+ ", password=" + password + "]";
}
}
User.hbm.xml :
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.live.beans">
<class name="User" table="user">
<id name="id"
type="int"
column="id"
length="15"/>
<property name="name"
type="string"
column="name"
length="45"
/>
<property name="email"
type="string"
column="email"
length="45"
/>
<property name="password"
type="string"
column="password"
length="45"
/>
</class>
</hibernate-mapping>
我的班级 HibernateTest.java :
package com.live.presentation;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.live.beans.User;
public class HibernateTest {
private Session session;
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
public static SessionFactory createSessionFactory() {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
serviceRegistry = new ServiceRegistryBuilder().applySettings(
configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
private void openSession(){
SessionFactory sessionFactory = createSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
}
private void closeSession(){
session.getTransaction().commit();
session.close();
}
public HibernateTest() {
openSession();
User p = new User(1, "Ali", "ali@gmail.com", "password");
session.save(p);
System.out.println("sauvegarde reussi");
closeSession();
}
public static void main(String[] args) {
new HibernateTest();
}
pom.xml :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>p01</groupId>
<artifactId>p01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
<name>HibernateTest</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>4.0.1.Final</version>
<classifier>tests</classifier>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.1.0.CR2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
</dependencies>
</project>
hibernate.cfg.xml中:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.url">jdbc:mysql://localhost/ment</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">false</property>
<mapping resource="com.live.hibernate.User.hbm.xml" />
</session-factory>
</hibernate-configuration>
文件夹结构:
src
|-- com
| live
| |-- hibernate
| | `-- User.hbm.xml
| live
| |`--beans
| | `-- User.java
| live
| `--presentation
| `-- HibernateTest.java
|--hibernate.cfg.xml
WebContent
|-- META-INF
|-- WEB-INF
|
|-- index.xhtml
pom.xml
当我到达HibernateTest.java类中的这一行时我有一个例外(我的意思是在debuging时):
session.save(p);
虽然我使用User p = new User(1,"Ali", "ali@gmail.com", "password");
我在session.save(p);
中遇到了同样的问题。
我正在使用MySQL,我创建了一个名为 ment 的数据库和一个包含四列(id,name,email,password)的表 user 。
答案 0 :(得分:1)
您的会话变量(您在HibernateTest的构造函数中使用的变量)尚未初始化。因此,它仍为null
,导致session.save(p);
抛出NPE。
将openSession()
中的代码更改为
private void openSession(){
SessionFactory sessionFactory = createSessionFactory();
session = sessionFactory.openSession();
session.beginTransaction();
}
即,在您的字段上打开新会话,而不是在该方法范围内的私有变量上打开,该变量在方法运行后消失。