2014-11-04 2 views
0

Привет, я работаю над составлением сущностей, используя @ManyToOne Annotation.нет строки с данным идентификатором существует hibernate

ниже мои лица с ManyToOne ассоциации между ними

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()); 
    } 

получать погрешность ниже линии

student con = (student) session.get(student .class, 
        String.valueOf(1)); 

Я использую EAGER FETCH TYPE, когда я сохранить данные я в состоянии сохранять и извлекать данные, используя SESSION.GET, но когда я комментировать session.save методы, даже если есть значения в базе данных для этих таблиц я получаю ниже ошибки

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) 

Я попытался решить эту проблему, но она показывает ту же ошибку.

пожалуйста, предложите мне, как решить эту

+0

Показать правильный код, ваш код говорит, что у вас есть LAZY-сопоставление между объектами, а затем где вы устанавливаете EAGER? Также покажите код, в котором вы пытаетесь получить объект и полный стек исключения. Кроме того, код говорит «student.setuserid (« 1 »);' но нет ссылки под названием «student», пожалуйста, предоставьте правильную информацию. – Chaitanya

+0

sorry.please найти обновленный fetchType = "EAGER". – user3824049

+0

интересно, согласно вашему предыдущему вопросу, у вас есть только пользовательский интерфейс, так что теперь вы добавили два столбца в таблицу для поддержания отношений? Так и мой ответ на этот вопрос устранил вашу проблему. – Chaitanya

ответ

4

От StackTrace он говорит, что спящий режим загружен Student объекта и когда он пытается загрузить StudentDetail объект, то он не может найти запись в таблице базов данных соответствия, что составной первичный ключ.

На основе StackTrace я думаю этот вопрос заключается в следующем:

У вас есть запись в таблице Student с первичным ключом как 1 и значений внешних ключей, как userrole1=1 и userrole2=null. Так что, когда вы пытались получить запись с идентификатором, как 1 из Student таблицы с использованием спящего режима и, как выборка стратегии EAGER тогда он пытался найти запись в Student_Detail таблице с составным первичным ключом как VALUE=1 и DESCRIPTION=null, но спящий режим не смогло найти и брошено исключение, говоря:

No row with the given identifier exists: [com.studentdetails2e#studentdetails(value=1, description=null)] 

так проверить ваши данные DB в студенческой таблице с первичным ключом, как 1 внешнего ключа отображение должно быть неправильным. Опять же, я думаю, что на стороне БД у вас нет отношения внешнего ключа между таблицами, потому что если это так, то DB не допустит неправильных FKey.

Update:

При использовании LAZY для отображения и попытаться извлечь запись для Student затем спящий режим будет назначить прокси-сервер для элементов коллекции StudentDetail т.е.. Когда вы пытаетесь получить доступ к этому элементу коллекции, тогда только спящий режим попадет в базу данных, чтобы получить запись для StiudentDetail.

В случае EAGER нагрузки, при попытке извлечь запись Student тогда сам спящий режим будет пытаться получить отображение StudentDetail объект, в связи с этим вы получаете исключение при использовании EAGER, но не для LAZY выборки.

+0

у нас не должно быть никаких отношений на стороне БД (это наше требование, мы должны сопоставлять их только с сущностью). Даже если мы можем извлекать данные из БД при использовании типа Lazy Fetch, почему бы нам не получить данные с использованием выборки тип EAGER only.pls предложите нам – user3824049

+0

на основе stacktrace, вы можете догадаться, почему у вас есть ошибка для EAGER, но не для LAZY, я обновил свой ответ с подробной информацией, пожалуйста, проверьте. – Chaitanya

+0

спасибо за информацию, но есть ли способ получить данные с помощью EAGER с одинаковым сопоставлением или его невозможно. – user3824049

Смежные вопросы