2015-05-05 2 views
0

Я новичок в спящем режиме. Я написал простую программу с четырьмя файлами. Employee.java это боб-класс с геттерами, которые устанавливают в нем.Персональный объект передан persisit

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org dtd/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">dbUrl</property> 
     <property name="connection.username">uname</property> 
     <property name="connection.password">pass</property > 
     <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
    <mapping resource="Employee.hbm.xml"/> 
    </session-factory> 
     </hibernate-configuration> 

Employee.hbm.xml

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
<class name="hibernate_prj.Employee" table="EMPLOYEE"> 
    <meta attribute="class-description"> 
    This class contains the employee detail. 
    </meta> 
    <id name="id" type="int" column="empid"> 
    <generator class="native"/> 
    </id> 
    <property name="firstName" column="empname" type="string"/> 
    <property name="dept" column="empdept" type="string"/> 
    <property name="salary" column="empsal" type="int"/> 
</class> 
</hibernate-mapping> 

StoreData.java

package hibernate_prj; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 

public class StoreData { 

public static void main(String[] args) { 

    Configuration cfg=new Configuration(); 

     cfg.configure("hibernate.cfg.xml"); 

    //creating seession factory object 
    @SuppressWarnings("deprecation") 
    SessionFactory factory=cfg.buildSessionFactory(); 

    //creating session object 
    Session session=factory.openSession(); 

    //creating transaction object 
    Transaction t=session.beginTransaction(); 

    try{ 
    Employee e1=new Employee(); 

    e1.setId(115); 
    e1.setFirstName("sonoo"); 
    e1.setDept("jaiswal"); 
    e1.setSalary(100); 

    session.persist(e1);//persisting the object 

    t.commit();//transaction is commited 
     session.close(); 

     }catch(Exception e) 
     { 
      System.out.println("E "+e.toString()); 
     } 
    System.out.println("successfully saved"); 
} 
} 

Я создал таблицу, используя следующую инструкцию SQL

create table employee (empid number(2,2),empname VARCHAR2(30), empdept varchar2(10), empsal number(5,2)); 

Но когда я запускаю эту программу я получаю следующее сообщение об ошибке:

org.hibernate.PersistentObjectException: detached entity passed to persist: hibernate_prj.Employee

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

ответ

1

Вы установили id сотрудника (до 115), но также настроил его на создание. Теперь Hibernat думает, что сущность уже сохраняется, так как она имеет id! = Null, но это не в сеансе ... это не нравится.

Просто удаление этой линии

e1.setId(115); 

должны решить эту проблему.

+0

большое спасибо ... :) это сработало ... я удалил это предложение sshruti

+0

Если это решило вашу проблему, пользовательский способ здесь, в stackoverflow, должен принять ответ. Поэтому другие знают, что проблема решена. –

0

Функция persist используется для обновления в этом случае, здесь ваша сущность не существует на вашем db, поэтому исключение сообщает вам, что вы пытаетесь обновить объект, у которого нет ссылки на ваш db (не связанный с существующей строкой на вашем db). Попробуйте удалить присвоение идентификатора, и если ot работает, используйте session.save(e1);, чтобы присвоить идентификатор.

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