Hibernate saving collections - java

So Im writing a test application. I want to save collections within every collected class. Each collected class has a unieq list of Data. I cant save the data classes.
the error I am getting
ERROR: Referential integrity constraint violation: "FK2EEFAAF2485486: PUBLIC.DATA FOREIGN KEY(NUMBER) REFERENCES PUBLIC.COLLECTED(KEY) (4)"; SQL statement: insert into data (number, data) values (null, ?) [23506-170]
Main class
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package hibernatecollectiontest;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
/**
*
* #author ivan
*/
public class HibernateCollectionTest {
/**
* #param args the command line arguments
*/
public static void main(String[] args)
{
Session session = Util.getSessionFactory().openSession();
Collected temp = new Collected();
temp.setDescription("test");
List<Data> local= new ArrayList<>();
for(int i=0;i<5;i++)
{
Data test = new Data();
test.setData("Data"+i);
local.add(test);
}
temp.setDatas(local);
session.beginTransaction();
session.save(temp);
session.getTransaction().commit();
Criteria crit = session.createCriteria(Collected.class);
List<Collected> dump =crit.list();
for(int i = 0 ; i < dump.size();i++)
{
System.out.println(dump.get(i).getKey()+" key "+dump.get(i).getDescription() +" describe ");
System.out.println("Size of collection is "+dump.get(i).getDatas().size());
for(int n=0;n<dump.get(i).getDatas().size();n++)
{
System.out.println(dump.get(i).getDatas().get(n).getData());
}
}
//session.flush();
}
}
The persistent class :
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package hibernatecollectiontest;
import java.util.ArrayList;
import java.util.List;
/**
*
* #author ivan
*/
public class Collected
{
private String description;
private int key;
private List<Data> datas = new ArrayList<>();
/**
* #return the description
*/
public String getDescription() {
return description;
}
/**
* #param description the description to set
*/
public void setDescription(String description) {
this.description = description;
}
/**
* #return the key
*/
public int getKey() {
return key;
}
/**
* #param key the key to set
*/
public void setKey(int key) {
this.key = key;
}
/**
* #return the datas
*/
public List<Data> getDatas() {
return datas;
}
/**
* #param datas the datas to set
*/
public void setDatas(List<Data> datas) {
this.datas = datas;
}
}
Data class inside the collection :
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package hibernatecollectiontest;
/**
*
* #author ivan
*/
public class Data
{
private int number;
private String data;
/**
* #return the number
*/
public int getNumber() {
return number;
}
/**
* #param number the number to set
*/
public void setNumber(int number) {
this.number = number;
}
/**
* #return the data
*/
public String getData() {
return data;
}
/**
* #param data the data to set
*/
public void setData(String data) {
this.data = data;
}
}
Hibernate Mappings :
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">
jdbc:h2:testdatabase
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.autocommit">true</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.H2Dialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Mapping files -->
<mapping resource="Collected.hbm.xml"/>
<mapping resource="Data.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Data.hbm
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernatecollectiontest">
<class name="Data" table="data">
<id name="number" column="number" type="java.lang.Integer">
<generator class="native"/>
</id>
<property column="data" name="data" type="java.lang.String"/>
</class>
</hibernate-mapping>
Collected.hbm
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernatecollectiontest">
<class name="Collected" table="collected">
<id name="key" column="key" type="java.lang.Integer">
<generator class="native"/>
</id>
<property column="description" name="description" type="java.lang.String"/>
<list name="datas" table="data" lazy="false" cascade="all">
<key column="number"/>
<list-index column="sortOrder"/>
<one-to-many class="hibernatecollectiontest.Data"/>
</list>
</class>
</hibernate-mapping>

To start with.,
Transaction is not getting committed.,
//session.getTransaction().commit();
Above line is commented in the code base.,

Related

`Unknown entity` Exception in hibernate

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" />

How to handle database null values in Hibernate Application?

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.

Hibernate in Eclipse: java.lang.ArrayIndexOutOfBoundsException at oracle.jdbc.driver.OracleSql.main(OracleSql.java:1032)

I am new to Hibernate. I am trying a sample application. The only output I get whenever I run either of DataStore.java or FetchData.java
java.lang.ArrayIndexOutOfBoundsException: 0
at oracle.jdbc.driver.OracleSql.main(OracleSql.java:1032)
Am not able to find what causes this exception. The application is basic. Just creating two tables, one with Question ids and corresponding questions, another table with Answers with corresponding question ids as foreign key. This is my first try in hibernate. If any one can solve this problem, I will be indebted to them. Thanks in advance.
DataStore.java
import java.util.ArrayList;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class DataStore {
public static void main(String[] args) {
Session session = new Configuration().configure("hibernate.cfg.xml")
.buildSessionFactory().openSession();
Transaction t = session.beginTransaction();
ArrayList<String> list1 = new ArrayList<String>();
list1.add("java is a programming language");
list1.add("java is a platform");
ArrayList<String> list2 = new ArrayList<String>();
list2.add("Servlet is an Interface");
list2.add("Servlet is an API");
Question question1 = new Question();
question1.setQname("What is Java?");
question1.setAnswers(list1);
Question question2 = new Question();
question2.setQname("What is Servlet?");
question2.setAnswers(list2);
session.persist(question1);
session.persist(question2);
t.commit();
session.close();
System.out.println("success");
}
}
FetchData.java
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class FetchData {
public static void main(String[] args) {
Session session = new Configuration().configure("hibernate.cfg.xml")
.buildSessionFactory().openSession();
Query query = session.createQuery("from Question");
List<Question> list = query.list();
Iterator<Question> itr = list.iterator();
while (itr.hasNext()) {
Question q = itr.next();
System.out.println("Question Name: " + q.getQname());
// printing answers
List<String> list2 = q.getAnswers();
Iterator<String> itr2 = list2.iterator();
while (itr2.hasNext()) {
System.out.println(itr2.next());
}
}
session.close();
System.out.println("success");
}
}
question.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<class name="Question" table="Question">
<id name="id" type="int" column="id">
<generator class="increment"></generator>
</id>
<property name="qname" column="qname" type="string"></property>
<list name="answers" table="Answers">
<key column="id"></key>
<index column="type"></index>
<element column="answer" type="string"></element>
<one-to-many class="Answer" />
</list>
</class>
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.Oracle10gDialect</property>
<property name="connection.url">jdbc:oracle:thin:#localhost:1521:xe</property>
<property name="connection.username">testuser</property>
<property name="connection.password">amudhan</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<mapping resource="question.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Question.java
import java.util.List;
public class Question {
private int id;
private String qname;
private List<String> answers;
/**
* #return the id
*/
public int getId() {
return id;
}
/**
* #param id
* the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* #return the qname
*/
public String getQname() {
return qname;
}
/**
* #param qname
* the qname to set
*/
public void setQname(String qname) {
this.qname = qname;
}
/**
* #return the answers
*/
public List<String> getAnswers() {
return answers;
}
/**
* #param answers
* the answers to set
*/
public void setAnswers(List<String> answers) {
this.answers = answers;
}
}
Answer.java
public class Answer {
private int id;
private String answer;
private String posterName;
/**
* #return the id
*/
public int getId() {
return id;
}
/**
* #param id
* the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* #return the answer
*/
public String getAnswer() {
return answer;
}
/**
* #param answer
* the answer to set
*/
public void setAnswer(String answer) {
this.answer = answer;
}
/**
* #return the posterName
*/
public String getPosterName() {
return posterName;
}
/**
* #param posterName
* the posterName to set
*/
public void setPosterName(String posterName) {
this.posterName = posterName;
}
}
Edit: This problem comes only when I add the following part in the question.hbm.xml.
<list name="answers" table="Answers">
<key column="id"></key>
<index column="type"></index>
<element column="answer" type="string"></element>
<one-to-many class="Answer" />
Simple insertion, updation with a single class/table work just fine. More than one class or table with foreign-key, the exception pops out.
This seems to be a problem with OracleSQL. I'd suggest making sure you have the latest JDBC as this may have been patched.

Hibernate query executes but nothing is added

I'm learning hibernate and when I run the following program, I get this message :
Hibernate: insert into contact (firstname, lastname, email, id) values (?, ?, ?, ?) but when I check the table, nothing seems to be inserted. What's the problem here ? Clearly the statement value field is null but why?
I have the following POJO:
public class Contact {
private String firstName;
private String lastName;
private String email;
private long id;
/**
* #return Email
*/
public String getEmail() {
return email;
}
/**
* #return First Name
*/
public String getFirstName() {
return firstName;
}
/**
* #return Last name
*/
public String getLastName() {
return lastName;
}
/**
* #param string Sets the Email
*/
public void setEmail(String string) {
email = string;
}
/**
* #param string Sets the First Name
*/
public void setFirstName(String string) {
firstName = string;
}
/**
* #param string sets the Last Name
*/
public void setLastName(String string) {
lastName = string;
}
/**
* #return ID Returns ID
*/
public long getId() {
return id;
}
/**
* #param l Sets the ID
*/
public void setId(long l) {
id = l;
}
}
and below are my hibernate config and hbm files:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//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.url">jdbc:mysql://localhost/aneesh</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Mapping files -->
<mapping resource="contact.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<?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="Contact" table="contact">
<id name="id" column="id" >
<generator class="assigned"/>
</id>
<property name="firstName" >
<column name="firstname" />
</property>
<property name="lastName">
<column name="lastname"/>
</property>
<property name="email" >
<column name="email"/>
</property>
</class>
</hibernate-mapping>
and here is my code to insert :
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;
public class HSession {
public static void main(String[] args) {
Session session = null;
try{
SessionFactory sessionGet = new Configuration().configure().buildSessionFactory();
session = sessionGet.openSession();
Contact contact = new Contact();
contact.setFirstName("xyz");
contact.setLastName("zyx");
contact.setEmail("x#xmail.com");
contact.setId(20);
session.save(contact);
}finally{
// Actual contact insertion will happen at this step
try {
session.flush();
session.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
You forgot the begin and commit the transaction.
session = sessionGet.openSession();
**Transaction tx= session.beginTransaction();**
Contact contact = new Contact();
contact.setFirstName("xyz");
contact.setLastName("zyx");
contact.setEmail("x#xmail.com");
contact.setId(20);
session.save(contact);
**tx.commit();**
Before you are saving the object you have to get the transaction and after saving the object you have to commit the transaction.
Transaction tx = session.beginTransaction();
session.save(contact);
tx.commit();
Use transaction in save.
session.getTransaction().begin();
session.save(contact);
session.getTransaction().commit();
you should do a commit for the insert to be reflected in database
try
session.getTransaction().commit();
after your
session.save(contact);

Help with Hibernate Collection Foreign Key Mapping

I'm running into significant difficulty getting my mapping file to work with a collection of elements via a foreign key in Hibernate. Java will try to load these files below and won't have any runtime exceptions, but the events table is never loaded as an object of an employee (it will remain null, but every other attribute loads from the DB). In my MySQL database, I have the following:
TABLE: Employees
Primary Key: username varchar
name varchar
areacode INTEGER
phone INTEGER
addressNumber INTEGER
addressLocation varchar
email varchar
TABLE: Events
Primary Key: ID INTEGER
startDate DateTime
endDate DateTime
customerName varchar
employeeUsername varchar
<?xml version="1.0"?>
<class name="Employee" table="Employees">
<id name="username" column="username" type="string"/>
<many-to-one name="contact" class="Contact" column="username" unique="false" update="false" insert="false" optimistic-lock="true" not-found="exception" embed-xml="true" />
</class>
<class name="Contact" table="Employees">
<id name="username" column="username" type="string"/>
<property name="name" column="name" type="string"/>
<property name="addressNumber" column="addressNumber" type="int"/>
<property name="areacode" column="areacode" type="int"/>
<property name="phone" column="phone" type="int"/>
<property name="addressLocation" column="addressLocation" type="string"/>
<property name="email" column="email" type="string"/>
</class>
<?xml version="1.0"?>
<class name="Event" table="Events">
<id name="ID" column="ID" type="int">
<generator class="assigned"/>
</id>
<property name="startDate" column="startDate" type="date"/>
<property name="endDate" column="endDate" type="date"/>
<property name="customerName" column="customerName" type="string"/>
</class>
<class name="Employee" table="Events" entity-name="Employee2">
<id name="username" column="employeeUsername" type="string"/>
<list name="events" cascade="all">
<key column="employeeUsername"/>
<list-index column="ID"/>
<one-to-many class="Event"/>
</list>
</class>
Assume the hibernate.cfg.xml file exists and works (If you feel this needs to be shown, please let me know). It does include both of the files in its mapping files part.
I have a feeling my error is probably in my declaration of the collection of events in my "list" declaration. Here are the Java classes:
package org.hibernate.employee;
import java.util.Date;
public class Event {
private int ID;
private Date startDate;
private Date endDate;
private String customerName;
public Event(){
System.out.println("blah");
}
/**
* #return the iD
*/
public int getID() {
return ID;
}
/**
* #param id the iD to set
*/
public void setID(int id) {
ID = id;
}
/**
* #return the startDate
*/
public Date getStartDate() {
return startDate;
}
/**
* #param startDate the startDate to set
*/
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
/**
* #return the endDate
*/
public Date getEndDate() {
return endDate;
}
/**
* #param endDate the endDate to set
*/
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
/**
* #return the customerName
*/
public String getCustomerName() {
return customerName;
}
/**
* #param customerName the customerName to set
*/
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
}
/*
* File: Contact.java
*/
package org.hibernate.employee;
/**
* This class represents a Contact information for an Employee.
*
*/
public class Contact {
private int username; // the contact identifier in the database
private int areacode; // the contact areacode
private int phone; // the contact phone
private String name; // the contact's name
private int addressNumber; // the contact's address number
private String addressLocation; // the contact's address location
private String email; // the contact's email
/**
* Constructs a Contact object.
*/
public Contact() {
}
/**
* #return the areacode
*/
public int getAreacode() {
return areacode;
}
/**
* #param areacode the areacode to set
*/
public void setAreacode(int areacode) {
this.areacode = areacode;
}
/**
* #return the phone
*/
public int getPhone() {
return phone;
}
/**
* #param phone the phone to set
*/
public void setPhone(int phone) {
this.phone = phone;
}
/**
* #return the name
*/
public String getName() {
return name;
}
/**
* #param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* #return the addressNumber
*/
public int getAddressNumber() {
return addressNumber;
}
/**
* #param addressNumber the addressNumber to set
*/
public void setAddressNumber(int addressNumber) {
this.addressNumber = addressNumber;
}
/**
* #return the addressLocation
*/
public String getAddressLocation() {
return addressLocation;
}
/**
* #param addressLocation the addressLocation to set
*/
public void setAddressLocation(String addressLocation) {
this.addressLocation = addressLocation;
}
/**
* #return the email
*/
public String getEmail() {
return email;
}
/**
* #param email the email to set
*/
public void setEmail(String email) {
this.email = email;
}
public String toString(){
String retVal = "";
retVal += "Address: " + this.addressNumber + " " + this.addressLocation + "\n";
retVal += "Email: " + this.email + "\n";
retVal += "Phone: " + this.areacode + " " + this.phone + "\n";
retVal += "Name: " + this.name + "\n";
return retVal;
}
public void setUsername(int username) {
this.username = username;
}
public int getUsername() {
return username;
}
}
/*
* File: Employee.java
*/
package org.hibernate.employee;
import java.util.List;
/**
* This class represents an Employee in a company database.
*
*/
public class Employee {
private String username; // the employee's username
private Contact contact; // the employee's contact information
private List events;
/**
* Constructs an Employee object.
*/
public Employee() {
super();
}
/**
* #return the username
*/
public String getUsername() {
return username;
}
/**
* #param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* #return the contact
*/
public Contact getContact() {
return contact;
}
/**
* #param contact the contact to set
*/
public void setContact(Contact contact) {
this.contact = contact;
}
/**
* #return the events
*/
public List getEvents() {
return events;
}
/**
* #param events the events to set
*/
public void setEvents(List events) {
this.events = events;
}
public String toString(){
String retVal = "";
System.out.println(events);
retVal += "Username: " + username + "\n";
retVal += "Contact: " + contact + "\n";
return retVal;
}
}
Your mappings are wrong for two (main) reasons:
Mapping both Employee and Contact to the same table that way is not going to work. many-to-one requires a foreign key (e.g. a separate column); you're trying to reuse the primary key instead.
Re-mapping Employee class to a different table isn't going to work either - table and class are incompatible. Using a different entity name prevents an immediate error, but that's not the appropriate usage of it.
What you should do instead is:
Map Contact as component.
Map collection of events directly on Employee as one-to-many association.
Something like:
<class name="Employee" table="Employees">
<id name="username" column="username" type="string"/>
<component name="Contact" class="Contact"> <!-- class attribute optional -->
<property name="name" column="name" type="string"/>
<property name="addressNumber" column="addressNumber" type="int"/>
<property name="areacode" column="areacode" type="int"/>
<property name="phone" column="phone" type="int"/>
<property name="addressLocation" column="addressLocation" type="string"/>
<property name="email" column="email" type="string"/>
</component>
<list name="events" cascade="all">
<key column="employeeUsername"/>
<list-index column="event_idx"/>
<one-to-many class="Event"/>
</list>
</class>
Note that list-index should really be a separate column in your table if you want to map list of events as ordered list; you can't map it to id. If you don't want to define it as a column, you can either map the list as <bag> instead (and, optionally, specify order-by attribute to sort that bag by) or map it as collection of composite elements where each Event will no longer be an independent entity. Whether or not that's applicable depends on your business requirements.

Categories

Resources