Hi i am working on Entity Mapping by using @ManyToOne Annotation.
below is my entities with manytoone association between them
student.java
@Entity
@Table(name = "student")
public class student{
@Id
@Column(name = "UserID")
private String userid;
@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumns({
@JoinColumn(name = "userrole1", referencedColumnName = "VALUE"),
@JoinColumn(name = "userrole2", referencedColumnName = "DESCRIPTION")
})
private studentdetails1 userrole1;
@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumns({
@JoinColumn(name = "userrole1", referencedColumnName = "VALUE",insertable=false, updatable=false),
@JoinColumn(name = "userrole2", referencedColumnName = "DESCRIPTION", insertable=false, updatable=false)
})
private studentdetails2 userrole2;
//setters and getters
//constructor
}
studentdetails1.java
@Data
@Entity
@Table(name = "student_details1")
public class studentdetails1 {
@Id
@Column(name = "VALUE")
private String value;
@Id
@Column(name = "DESCRIPTION")
private String description;
//setters and getters
//constructor
}
studentdetails2.java
@Data
@Entity
@Table(name = "student_details2")
public class studentdetails2 {
@Id
@Column(name = "VALUE")
private String value;
@Id
@Column(name = "DESCRIPTION")
private String description;
//setters and getters
//constructor
}
appmain.java
public static void main()
{
//session configuration
StudentDetails1 sd1 = new StudentDetails1();
sd1.setValue("abc");
sd1.setDescription("abcdef");
StudentDetails2 sd2 = new StudentDetails2();
sd2.setValue("abcd");
sd2.setDescription("abcdefd");
Student student1 = new Student();
student1.setUserid("1");
student1.setUserrole1(sd1);
student1.setUserrole2(sd2);
Student student2 = new Student();
student2.setUserid("2");
student2.setUserrole1(sd1);
student2.setUserrole2(sd2);
session.save(student1 );
session.save(student2 );
Student con = (Student ) session.get(Student .class,
String.valueOf(1));
System.out.println(con.getUserid());
}
getting error for below line
student con = (student ) session.get(student .class,
String.valueOf(1));
I am using EAGER FETCH TYPE,when I save the data I am able save and retrieve the data using SESSION.GET but when I comment the session.save methods, even though there are values in the database for these tables I am getting below error
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.studentdetails2e#studentdetails2(value=1, description=null)]
at org.hibernate.impl.SessionFactoryImpl$2.handleEntityNotFound(SessionFactoryImpl.java:447)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:233)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:285)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1080)
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:1028)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:623)
at org.hibernate.type.EntityType.resolve(EntityType.java:431)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:140)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:898)
at org.hibernate.loader.Loader.doQuery(Loader.java:773)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1933)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:86)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:76)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3270)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:496)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:477)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:227)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:285)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1080)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:997)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:990)
at com.softsol.test.ActvDayRangeRlTest.AccountValid(ActvDayRangeRlTest.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
I tried to solve this but it showing same error.
please suggest me how to solve this
From stacktrace it says that hibernate loaded Student
entity and when it is trying to load the StudentDetail
entity then it is not able to find a record in database table matching that composite primary key.
Based on the stacktrace I guess the issue is this:
You have a record in Student
table with primary key value as 1
and foreign key values as userrole1=1
and userrole2=null
. So when you tried to get a record with id as 1
from Student
table using hibernate and as the fetching strategy is EAGER
then it tried to find a record in Student_Detail
table with composite primary key as VALUE=1
and DESCRIPTION=null
but hibernate was not able to find it and thrown an exception saying:
No row with the given identifier exists: [com.studentdetails2e#studentdetails(value=1, description=null)]
So check your DB data in Student table with primary key as 1
, the foreign key mapping should be incorrect. Again I guess at DB side you do not have any foreign key relationship between tables because if that is the case then DB will not allow incorrect FKeys.
Update:
When you use LAZY
for mapping and try to fetch a record for Student
then hibernate will assign proxy for the collection elements i.e StudentDetail. When you try to access this collection element then only hibernate will hit the database to get a record for StiudentDetail.
In case of EAGER
loading, when you try to fetch a record of Student
then there itself hibernate will try to get the mapping StudentDetail entity, due to this you are getting exception while using EAGER
but not for LAZY
fetching.