Hi I have a class Vehicle is the Parent Class and Two Wheeler and Four Wheeler are the Child Classes that extends parent class.
The problem is when I'm inserting data to my rto(id,name,vehicle_type,steeringHandle,steeringWheel) table in database it is inserting the assigned data for the TwoWheeler but for FourWheeler it is inserting the data for the method present in Parent Class but when I'm calling a method from child class(FourWheeler(setsteeringWheel)) it's not updating the specified data in the
steeringWheel column. I'm adding the screen shot of my table.
Vehicle Class
`
package hibernate_discriminator;
import java.io.Serializable;
public class Vehicle implements Serializable {
private int id;
private String name;
public Vehicle(){
}
public int getId(){
return id;
}
public void setId(int id){
this.id= id;
}
public void setName(String name){
this.name= name;
}
public String getName(){
return name;
}
}
TwoWheeler Class
`package hibernate_discriminator;
public class TwoWheeler extends Vehicle{
private String steeringHandle;
public TwoWheeler(){
}
public void setsteeringHandle(String handle){
this.steeringHandle= handle;
}
public String getsteeringHandle(){
return steeringHandle;
}
}
`
FourWheeler Class
package hibernate_discriminator;
public class FourWheeler extends Vehicle {
private String steeringWheel;
public FourWheeler(){
}
public void setsteeringWheel(String wheel){
this.steeringWheel= steeringWheel;
}
public String getsteeringWheel(){
return steeringWheel;
}
}
Mapping File
<?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">
<hibernate-mapping>
<class name="hibernate_discriminator.Vehicle" table="rto" discriminator-value="vehicle">
<id name="id" column="id" type="integer">
<generator class="increment"></generator>
</id>
<discriminator column="vehicle_type" type="string"></discriminator>
<property name="name" column="name" type="string"></property>
<subclass name="hibernate_discriminator.TwoWheeler" extends="Vehicle" discriminator-value="Bike">
<property name="steeringHandle" column="steeringHandle" type="string"></property>
</subclass>
<subclass name="hibernate_discriminator.FourWheeler" extends="Vehicle" discriminator-value="Car">
<property name="steeringWheel" column="steeringWheel" type="string"></property>
</subclass>
</class>
</hibernate-mapping>
Configuration file
<?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="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">ankita</property>
<property name="hibernate.connection.autocommit">false</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<mapping resource="resources/Vehicle.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Main Class
public class Main {
public static void main(String[] args){
Configuration cfg= new Configuration();
cfg.configure("/resources/Config.cfg.xml");
SessionFactory sf= cfg.buildSessionFactory();
Session s= sf.openSession();
Transaction tx= s.beginTransaction();
Vehicle v= new Vehicle();
v.setName("Vehicle");
TwoWheeler tw= new TwoWheeler();
tw.setName("CBR");
tw.setsteeringHandle("CBR Handle");
FourWheeler fw= new FourWheeler();
fw.setName("Audi A4");
fw.setsteeringWheel("Audi a7 Wheel");
s.save(v);
s.save(tw);
s.save(fw);
s.flush();
tx.commit();
}
}
Adding my database scrrenshot
FourWheeler Class
public class Main {
public static void main(String[] args){
Configuration cfg= new Configuration();
cfg.configure("/resources/Config.cfg.xml");
SessionFactory sf= cfg.buildSessionFactory();
Session s= sf.openSession();
Transaction tx= s.beginTransaction();
Vehicle v= new Vehicle();
v.setName("Vehicle");
TwoWheeler tw= new TwoWheeler();
tw.setName("CBR");
tw.setsteeringHandle("CBR Handle");
FourWheeler fw= new FourWheeler();
fw.setName("Audi A4");
fw.setsteeringWheel("Audi a7 Wheel");
s.save(v);
s.save(tw);
s.save(fw);
s.flush();
tx.commit();
}
}
I think your problem is here...
public void setsteeringWheel(String wheel){
this.steeringWheel= steeringWheel;
}
The method parameter is wheel, but you're assigning the value of steeringWheel. (You're assigning this.steeringWheel = steeringWheel, which means it will have the same value -- null -- after the call to setsteeringWheel().)
Problem is here
public void setsteeringWheel(String wheel){
this.steeringWheel= steeringWheel;
}
You are not using the passed parameter
this.steeringWheel= wheel;
Related
I'm new with hibernate, after writing my entities, hibernate says that it cannot locate the getters and setters. I got one error at the time, like :
Exception in thread "main" org.hibernate.PropertyNotFoundException: Could not locate getter method for property [entites.Foret#idForet]
at lanceur.Test.main(Test.java:43)
Here is my cfg.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">
<hibernate-mapping>
<class name="entites.Foret" table="FORET">
<id name="idForet" type="long" column="idForet">
<generator class="increment" />
</id>
<set name = "emplacement_arbre" table ="ARBRE" lazy ="true" fetch = "select" cascade ="save-update, delete">
<key column = "idForet"/>
<one-to-many class ="entites.Arbre"/>
</set>
<property name="taille_foret" />
<!--<property name="coordonnees" /> -->
<property name="ville" />
<property name="matricule" />
<property name="nom" />
</class>
</hibernate-mapping>
And my foret.hbm.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.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<!-- <property name="hibernate.connection.datasource">jdbc/voteo</property>-->
<property name="hibernate.connection.password">mdp</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/Laforet</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">false</property>
<property name="hibernate.connection.autocommit">false</property>
<property name="hibernate.connection.release_mode">after_transaction</property>
<mapping resource="utilisateur.hbm.xml" />
<mapping resource="foret.hbm.xml" />
<mapping resource="arbre.hbm.xml" />
<mapping resource="adresse.hbm.xml" />
</session-factory>
</hibernate-configuration>
Also my java entity:
package entites;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
#Entity
#Table(name = "FORET")
public class Foret {
#GeneratedValue
#Id
private Long idForet;
#OneToMany(mappedBy = "Foret")
private List<Arbre> emplacement_arbre;
private int taille_foret;
private double[] coordonnees;
private String ville;
private String matricule;
private String nom;
public List<Arbre> getEmplacement_arbre() {
return emplacement_arbre;
}
public void setEmplacement_arbre(List<Arbre> emplacement_arbre) {
this.emplacement_arbre = emplacement_arbre;
}
public int getTaille_foret() {
return taille_foret;
}
public void setTaille_foret(int taille_foret) {
this.taille_foret = taille_foret;
}
public Long getIdForet() {
return idForet;
}
public void setIdForet(Long idForet) {
this.idForet = idForet;
}
public double[] getCoordonnees() {
return coordonnees;
}
public void setCoordonnees(double[] coordonnees) {
this.coordonnees = coordonnees;
}
public String getMatricule() {
return matricule;
}
public void setMatricule(String matricule) {
this.matricule = matricule;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
#Override
public String toString() {
return "Foret [emplacement_arbre=" + emplacement_arbre + ", taille_foret=" + taille_foret + ", id=" + idForet
+ ", nom=" + nom + "]";
}
public String getVille() {
return ville;
}
public void setVille(String ville) {
this.ville = ville;
}
}
I checked my javabean naming convention and it seems correct.
Any suggestions ?
package com.simpleprogrammer;
import org.hibernate.Session;
public class Program {
public static void main(String[] args) {
System.out.println("HEY");
Session session = HibernateUtilities.getSessionFactory().openSession();
session.beginTransaction();
User user = new User();
user.setName("pallavi");
user.setGoal(100);
session.getTransaction().commit();
session.close();
HibernateUtilities.getSessionFactory().close();
}
User.java
package com.simpleprogrammer;
public class User {
private int id;
private String name;
private int total;
private int goal;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getGoal() {
return goal;
}
public void setGoal(int goal) {
this.goal = goal;
}
}
HibernateUtilities.java
package com.simpleprogrammer;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtilities {
private static SessionFactory sessionFactory;
private static StandardServiceRegistry serviceRegistry;
static{
try{
Configuration configuration = new Configuration().configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
catch(HibernateException exception){
System.out.println("Problem creating session factory");
exception.printStackTrace();
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
/*
public static void setSessionFactory(SessionFactory sessionFactory) {
HibernateUtilities.sessionFactory = sessionFactory;
} */
}
Hibernate config file :-----------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.default_schema">protein_tracker</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.generate_statistics">false</property>
<mapping resource="com/simpleprogrammer/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
User mapping file-----------------------
<?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 1 May, 2017 12:09:45 PM by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.simpleprogrammer.User" table="USERS">
<id name="id" type="int">
<column name="ID" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="total" type="int">
<column name="TOTAL" />
</property>
<property name="goal" type="int">
<column name="GOAL" />
</property>
</class>
</hibernate-mapping>
Everything is working fine but data is not getting stored in database, i dont understand what is wrong!
You create the User entity, but you do not tell the persistence provider to actually manage it and eventually physically store it in the database:
User user = new User();
user.setName("pallavi");
user.setGoal(100);
session.persist(user);
Alternatively you can use save method.
This is the case when creating a new entity. If you were to update an existing entity, which you queries within the same transaction, then you would not need to explicitly call the update or merge operation as the persistence provider would do that for you implicitly on transaction commit.
I am learning hibernate and I can't figure out why is this error popping up. I tried searching but I couldn't find a solution that helped me. I'd like to learn why am I getting this error.
Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.simpleprogrammer.User
at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776)
at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1451)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:100)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:678)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:670)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:665)
at Program.main(Program.java:23)
Please help I have already wasted so many hours debugging this.
Here is my simple program,
Program.java
import org.hibernate.Session;
import com.simpleprogrammer.HibernateUtilities;
import com.simpleprogrammer.User;
public class Program {
/**
* #param args
* #throws ClassNotFoundException
* #throws SQLException
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World");
Session session = HibernateUtilities.getSessionFactory().openSession();
session.beginTransaction();
User user = new User();
user.setName("Deepak");
user.setTotal(130);
user.setGoal(150);
session.save(user);
session.getTransaction().commit();
session.close();
}
}
HibernateUtilities.java
package com.simpleprogrammer;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtilities {
public static SessionFactory sessionFactory;
public static ServiceRegistry serviceRegistry;
static{
try{
Configuration configuation = new Configuration().configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuation.getProperties()).build();
sessionFactory = configuation.buildSessionFactory(serviceRegistry);
}catch(HibernateException e){
System.out.println("Error while creating Session Factory.");
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
}
User.java
package com.simpleprogrammer;
public class User {
private int id;
private String name;
private int total;
private int goal;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getGoal() {
return goal;
}
public void setGoal(int goal) {
this.goal = goal;
}
}
User.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 Oct 28, 2015 8:05:49 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.simpleprogrammer.User" table="users">
<id name="id" type="int">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="name" />
</property>
<property name="total" type="int">
<column name="total" />
</property>
<property name="goal" type="int">
<column name="goal" />
</property>
</class>
</hibernate-mapping>
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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.default_schema">protein_tracker</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/simpleprogrammer/User.hbm.xml" />
</session-factory>
Actually I was using Hibernate 5 jars . But the tutorial is actually for Hibernate 4. When I used Hibernate 4 jars everything seems to working fine.
May be you don't need <mapping resource="com/simpleprogrammer/User.hbm.xml" />. Instead, try <mapping resource="User.hbm.xml" />
This question already has answers here:
Maven Run Project
(6 answers)
Closed 7 years ago.
In Eclipse, I have been building a simple Hibernate+Spring+MySQL+Maven project recently.I am stuck at the stage of database&java connection.When I run the project, it gives the the following error:
Exception in thread "main" org.hibernate.MappingException: Unable to load class [ src/main/java/com.hibernate.data/Person] declared in Hibernate configuration <mapping/> entry
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2279)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2227)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2207)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2160)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2075)
at com.test.Main.main(Main.java:17)
Caused by: java.lang.ClassNotFoundException:src/main/java/com.hibernate.data/Person
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:260)
at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:193)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2276)
... 5 more
The main class:
package com.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import com.hibernate.data.Person;
public class Main {
public static void main(String [] args){
// Create a configuration instance
Configuration configuration = new Configuration();
// Provide configuration file
configuration.configure("hibernate.cfg.xml");
// Build a SessionFactory
SessionFactory factory = configuration.buildSessionFactory(new StandardServiceRegistryBuilder().configure().build());
// Get current session, current session is already associated with Thread
Session session = factory.getCurrentSession();
// Begin transaction, if you would like save your instances, your calling of save must be associated with a transaction
Transaction tx = session.getTransaction();
// Create person
Person newPerson = new Person();
newPerson.setFirstName("Peter");
newPerson.setLastName("Jackson");
newPerson.setGender("Male");
newPerson.setAge(30);
//Save
session.save(newPerson);
session.flush();
tx.commit();
session.close();
/*
#SuppressWarnings("deprecation")
SessionFactory sf = new Configuration().configure().buildSessionFactory();
System.out.println("CFG and hbm files loaded successfully.");
Session session = sf.openSession();
session.beginTransaction();
System.out.println("Transaction began");
*/
}
}
hbm.xml file:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class table="Person" lazy="false" name="com.hibernate.data.Person" >
<id column="PERSON_ID" type="int" name="id" >
<generator class="increment"/>
</id>
<property name="firstName" column="PERSON_FIRSTNAME" type="string" />
<property name="lastName" column="PERSON_LASTNAME" type="string" />
<property name="gender" column="PERSON_GENDER" type="string" />
<property name="age" column="PERSON_AGE" type="int" />
</class>
hibernate.cfg.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/PERSONDB</property>
<property name='connection.username'>root</property>
<property name='connection.password'>root</property>
<!-- SQL dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Specify session context -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Show SQL -->
<property name="show_sql">true</property>
<!-- Referring Mapping File -->
<mapping resource="domain-classes.hbm.xml"/>
<mapping class="src/main/java/com.hibernate.data/Person"/>
</session-factory>
</hibernate-configuration>
Person.java:
package com.hibernate.data;
public class Person {
private int id;
private String firstName;
private String lastName;
private String gender;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
What is wrong here?
EDIT:
I modified pom.xml file as maven-exec plugin requires:
Additionally, final project structure is as follows:
but still, it gives the same error.What am I doing wrong?
i think:
<mapping class="src/main/java/com.hibernate.data/Person"/>
must be:
<mapping class="com.hibernate.data.Person"/>
also be sure that where is your hbm.xml file?if it is in com package you should write resource like this:
<mapping resource="com/domain-classes.hbm.xml"/>
change
<mapping class="src/main/java/com.hibernate.data/Person"/>
to
<mapping class="com.hibernate.data.Person"/>
I am getting " org.hibernate.PropertyAccessException" due to null values in my database table. How to handle the exception?
My files are
FetchTest.java
package com.raj.java.hiberanteDemos;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class FetchTest {
public static void main(String[] args) {
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
SessionFactory factory=cfg.buildSessionFactory();
Session session1=factory.openSession();
Employee emp1=(Employee)session1.get(Employee.class,7839);
System.out.println(emp1.getEmpno()+" "+emp1.getEname()+" "+emp1.getSal());
session1.close();
Session session2=factory.openSession();
Employee emp2=(Employee)session2.load(Employee.class,7839);
System.out.println(emp2.getEmpno()+" "+emp2.getEname()+" "+emp2.getSal());
session2.close();
}
}
Employee.java
package com.raj.java.hiberanteDemos;
import java.sql.Date;
class Employee {
private int empno, mgr, deptnumber;
private String ename, job;
private double sal, comm;
private Date hiredate;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public int getDeptnumber() {
return deptnumber;
}
public void setDeptnumber(int deptnumber) {
this.deptnumber = deptnumber;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public double getComm() {
return comm;
}
public void setComm(double comm) {
this.comm = comm;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
}
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="hbm2ddl.auto">update</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">someValidurl</property>
<property name="connection.username">username</property>
<property name="connection.password">password</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.show_sql">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<mapping resource="employee.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
employee.hbm.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">
<hibernate-mapping>
<!-- <class name="com.javatpoint.mypackage.Employee" table="employee"> <id
name="empid"> <generator class="assigned"></generator> </id> <property name="firstName"></property>
<property name="lastName"></property> </class> -->
<class name="com.raj.java.hiberanteDemos.Employee" table="emp">
<id name="empno" type="int" column="EMPNO">
<generator class="increment" />
</id>
<property name="ename" type="java.lang.String" />
<property name="mgr" type="int" />
<property name="deptnumber" type="int" column="deptno" />
<property name="job" type="java.lang.String" />
<property name="sal" type="double" />
<property name="comm" type="double" />
<property name="hiredate" type="java.sql.Date" />
</class>
</hibernate-mapping>
When I ran this application I am getting below error message.
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select employee0_.EMPNO as EMPNO0_0_, employee0_.ename as ename0_0_, employee0_.mgr as mgr0_0_, employee0_.deptno as deptno0_0_, employee0_.job as job0_0_, employee0_.sal as sal0_0_, employee0_.comm as comm0_0_, employee0_.hiredate as hiredate0_0_ from emp employee0_ where employee0_.EMPNO=?
Exception in thread "main" org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of com.raj.java.hiberanteDemos.Employee.setMgr
at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:215)
at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:185)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3232)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
at org.hibernate.loader.Loader.doQuery(Loader.java:717)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1785)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:47)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:41)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:799)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:792)
at com.raj.java.hiberanteDemos.FetchTest.main(FetchTest.java:13)
Caused by: net.sf.cglib.beans.BulkBeanException
at com.raj.java.hiberanteDemos.Employee$$BulkBeanByCGLIB$$142cfd75.setPropertyValues(<generated>)
at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:212)
... 19 more
Caused by: java.lang.NullPointerException
... 21 more
my emp table data
when I update all the null values with 0 or some other values its working fine.
Please help me in solving the error without updating null values in database table.
Thanks in Advance,
Raj
I would personally recommend to actually "clean" the database values, maybe setting the column not nullable.
But if this can't be done, what you can do is modify your setters, so that it checks for null:
public void setComm(Double comm) {
if(null != comm){
this.comm = comm;
}else{
this.comm = 0;
}
}
hope this helps
Your mgr-Property is int, which does not allow null. Change it to Integer, which allows null. Or make a default value for your mgr column.
The best way to avoid Hibernate's attempts at setting null values to primitives is to use Wrapper classes (Integer, Long, Double...); and especially, if you need to tack on a column or 2 to an existing table. Auto-boxing is your friend.