I am facing following problem, I have created 2 tables (student and address) with foreign key in address table. I am using hibernate annotations to insert records into these tables. But it is trying to insert records into 'student_tbl_address_tbl' which is not created in database.
Following ar pojo classes
- Student.java
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="student_tbl")
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 8876327743522818732L;
@Id
private long sid;
@Column(name="sname")
private String sname;
@Column(name="age")
private double age;
@OneToMany(cascade=CascadeType.ALL)
private Set<Address> addresses=new HashSet<Address>(0);
@OneToMany(mappedBy="student",cascade=CascadeType.ALL)
public Set<Address> getAddresses() {
return addresses;
}
public void setAddresses(Set<Address> addresses) {
this.addresses = addresses;
}
public long getSid() {
return sid;
}
public void setSid(long sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public double getAge() {
return age;
}
public void setAge(double age) {
this.age = age;
}
}
- Address.java
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="address_tbl")
public class Address implements Serializable{
/**
*
*/
private static final long serialVersionUID = 6583374367093492573L;
@Id
long adno;
@Column(name="street")
String street;
@Column(name="city")
String city;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="sid")
Student student;
public long getadno() {
return adno;
}
public void setadno(long adno) {
this.adno = adno;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
I have created following class to store the records inside the database
- Write.java
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Write {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Student s=new Student();
s.setAge(25d);
s.setSid(1l);
s.setSname("suresh");
Set<Address> addressSet=new HashSet<Address>();
Address a=new Address();
a.setadno(1l);
a.setCity("hyd");
a.setStreet("kukatpally");
a.setStudent(s);
addressSet.add(a);
a=new Address();
a.setadno(2l);
a.setCity("sec");
a.setStreet("ameerpet");
a.setStudent(s);
addressSet.add(a);
s.setAddresses(addressSet);
session.save(s);
tx.commit();
session.close();
}
}
following is the exception i got,
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select address_.adno, address_.city as city1_, address_.street as street1_, address_.sid as sid1_ from address_tbl address_ where address_.adno=?
Hibernate: select address_.adno, address_.city as city1_, address_.street as street1_, address_.sid as sid1_ from address_tbl address_ where address_.adno=?
Hibernate: insert into student_tbl (age, sname, sid) values (?, ?, ?)
Hibernate: insert into address_tbl (city, street, sid, adno) values (?, ?, ?, ?)
Hibernate: insert into address_tbl (city, street, sid, adno) values (?, ?, ?, ?)
Hibernate: insert into student_tbl_address_tbl (student_tbl_sid, addresses_adno) values (?, ?)
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not insert collection: [com.tbss.Student.addresses#1]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1205)
at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:171)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at com.tbss.Write.main(Write.java:41)
Caused by: java.sql.SQLException: Invalid object name 'student_tbl_address_tbl'.
at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)
at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632)
at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:584)
at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:546)
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:504)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46)
at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1168)
... 10 more
Please send the answer to "[email protected]"