Hibernate(Inverse和Cascade属性)

来源:互联网 发布:尼布楚条约知乎 编辑:程序博客网 时间:2024/05/29 17:38

欢迎访问北大青鸟大连鑫鼎中心 www.0411bdqn.com

 

当inverse=false时,hibernate如何将对set的改动反映到数据库中

 

(1)执行添加操作

<set name="employees" inverse="false">
            <key>
                <column name="p_id" />
            </key>
            <one-to-many class="entity.Employee" />
</set>

public void testInverse(){
       Session s = HibernateSessionFactory.getSession();
       Transaction t = s.beginTransaction();
       Project p = (Project) s.get(Project.class, 1);
        Employee e = new Employee();
       e.setEmployeeName("周杰伦");
       p.getEmployees().add(e);
       t.commit();
}

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?
Hibernate: select employees0_.p_id as p2_1_, employees0_.employee_id as employee1_1_, employees0_.employee_id as employee1_0_0_, employees0_.p_id as p2_0_0_, employees0_.employee_name as employee3_0_0_, employees0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employees0_ where employees0_.p_id=?
Hibernate: update bdqn.dbo.employee set p_id=? where employee_id=?

org.hibernate.TransientObjectException: entity.Employee
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)
..........
------------------------------------------------------------------------------------------------------------

<set name="employees" inverse="false" cascade="all">
        <key>
            <column name="p_id" />
        </key>
       <one-to-many class="entity.Employee" />
</set>  

public void testInverse(){
      Session s = HibernateSessionFactory.getSession();
      Transaction t = s.beginTransaction();
      Project p = (Project) s.get(Project.class, 1);
      Employee e = new Employee();
      e.setEmployeeName("周杰伦");
      p.getEmployees().add(e);
      t.commit();
}

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?
Hibernate: select employees0_.p_id as p2_1_, employees0_.employee_id as employee1_1_, employees0_.employee_id as employee1_0_0_, employees0_.p_id as p2_0_0_, employees0_.employee_name as employee3_0_0_, employees0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employees0_ where employees0_.p_id=?
Hibernate: insert into bdqn.dbo.employee (p_id, employee_name, employee_desc) values (?, ?, ?)
Hibernate: update bdqn.dbo.employee set p_id=? where employee_id=?

----------------------------------------------------------------------------------------------------

          14                     周杰伦                       NULL                          1

----------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

<set name="employees" inverse="true" cascade="all">  
     <key>  
         <column name="p_id" />  
     </key>  
      <one-to-many class="entity.Employee" />  
</set>  

public void testInverse(){
      Session s = HibernateSessionFactory.getSession();
      Transaction t = s.beginTransaction();
       Project p = (Project) s.get(Project.class, 1);
       Employee e = new Employee();
     e.setEmployeeName("周杰伦");
   p.getEmployees().add(e);
   t.commit();
}

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?
Hibernate: select employees0_.p_id as p2_1_, employees0_.employee_id as employee1_1_, employees0_.employee_id as employee1_0_0_, employees0_.p_id as p2_0_0_, employees0_.employee_name as employee3_0_0_, employees0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employees0_ where employees0_.p_id=?
Hibernate: insert into bdqn.dbo.employee (p_id, employee_name, employee_desc) values (?, ?, ?)

----------------------------------------------------------------------------------------------------

          15                     周杰伦                       NULL                          NULL                

----------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

 

 

 

 

 

<set name="employees" inverse="true">  
    <key>  
       <column name="p_id" />  
   </key>  

   <one-to-many class="entity.Employee" />  
</set>  

public void testInverse() {
       Session s = HibernateSessionFactory.getSession();
       Transaction t = s.beginTransaction();
       Project p = (Project) s.get(Project.class, 1);
       Employee e = (Employee) s.get(Employee.class, 14);
       p.getEmployees().remove(e);
       t.commit();
}

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?
Hibernate: select employee0_.employee_id as employee1_0_0_, employee0_.p_id as p2_0_0_, employee0_.employee_name as employee3_0_0_, employee0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employee0_ where employee0_.employee_id=?
Hibernate: select employees0_.p_id as p2_1_, employees0_.employee_id as employee1_1_, employees0_.employee_id as employee1_0_0_, employees0_.p_id as p2_0_0_, employees0_.employee_name as employee3_0_0_, employees0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employees0_ where employees0_.p_id=?


(2)执行更新操作

<set name="employees" inverse="true">  
      <key>  
            <column name="p_id" />  
      </key>  
      <one-to-many class="entity.Employee" />  
</set>  

public void testInverse() {
    Session s = HibernateSessionFactory.getSession();
      Transaction t = s.beginTransaction();
      Project p = (Project) s.get(Project.class, 1);
      Employee e = (Employee) s.get(Employee.class, 14);
      p.getEmployees().remove(e);
      t.commit();
}

 

 

----------------------------------------------------------------------------------------------------

          14                     周杰伦                       NULL                          1

----------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

 

 

<set name="employees" inverse="false">   
      <key>   
            <column name="p_id" />   
      </key>   
      <one-to-many class="entity.Employee" />   
</set>   

public void testInverse() {
      Session s = HibernateSessionFactory.getSession();
      Transaction t = s.beginTransaction();
      Project p = (Project) s.get(Project.class, 1);
      Employee e = (Employee) s.get(Employee.class, 14);
      p.getEmployees().remove(e);
      t.commit();
}

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?
Hibernate: select employee0_.employee_id as employee1_0_0_, employee0_.p_id as p2_0_0_, employee0_.employee_name as employee3_0_0_, employee0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employee0_ where employee0_.employee_id=?
Hibernate: select employees0_.p_id as p2_1_, employees0_.employee_id as employee1_1_, employees0_.employee_id as employee1_0_0_, employees0_.p_id as p2_0_0_, employees0_.employee_name as employee3_0_0_, employees0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employees0_ where employees0_.p_id=?
Hibernate: update bdqn.dbo.employee set p_id=null where p_id=? and employee_id=?

----------------------------------------------------------------------------------------------------

          14                     周杰伦                       NULL                          NULL                      

----------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

(3)执行删除操作

<set name="employees" inverse="true">   
    <key>   
         <column name="p_id" />   
</key>   
    <one-to-many class="entity.Employee" />   
</set>   

public void testInverse() {
    Session s = HibernateSessionFactory.getSession();
    Transaction t = s.beginTransaction();
    Project p = (Project) s.get(Project.class, 2);
    s.delete(p);
    t.commit();
}

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?  
Hibernate: delete from bdqn.dbo.project where project_id=?

org.hibernate.exception.ConstraintViolationException: could not delete: [entity.Project#2]
   at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
   at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
   at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2308)
   at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2440)
   at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:73)
   at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
   at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
   at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
   at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
   at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
   at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
   at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
   at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
   at cases.InverseTest.testInverse(InverseTest.java:18)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at junit.framework.TestCase.runTest(TestCase.java:154)
   at junit.framework.TestCase.runBare(TestCase.java:127)
   at junit.framework.TestResult$1.protect(TestResult.java:106)
   at junit.framework.TestResult.runProtected(TestResult.java:124)
   at junit.framework.TestResult.run(TestResult.java:109)
   at junit.framework.TestCase.run(TestCase.java:118)
   at junit.framework.TestSuite.runTest(TestSuite.java:208)
   at junit.framework.TestSuite.run(TestSuite.java:203)
   at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
   at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: DELETE 语句与 REFERENCE 约束"FK_employee_project"冲突。该冲突发生于数据库"bdqn",表"dbo.employee", column 'p_id'。
   at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
   at com.microsoft.sqlserver.jdbc.IOBuffer.processPackets(Unknown Source)
   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getPrepExecResponse(Unknown Source)
   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PreparedStatementExecutionRequest.executeStatement(Unknown Source)
   at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown Source)
   at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unknown Source)
   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(Unknown Source)
   at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
   at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2291)
   ... 29 more
------------------------------------------------------------------------------------------------------------

<set name="employees" inverse="true" cascade="delete">  
      <key>  
            <column name="p_id" />  
      </key>  
      <one-to-many class="entity.Employee" />  
</set>  


public void testInverse() {
    Session s = HibernateSessionFactory.getSession();
    Transaction t = s.beginTransaction();
    Project p = (Project) s.get(Project.class, 2);
    s.delete(p);
    t.commit();
}

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?
Hibernate: select employees0_.p_id as p2_1_, employees0_.employee_id as employee1_1_, employees0_.employee_id as employee1_0_0_, employees0_.p_id as p2_0_0_, employees0_.employee_name as employee3_0_0_, employees0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employees0_ where employees0_.p_id=?
   Hibernate: delete from bdqn.dbo.employee where employee_id=?
   Hibernate: delete from bdqn.dbo.employee where employee_id=?
   Hibernate: delete from bdqn.dbo.employee where employee_id=?
   Hibernate: delete from bdqn.dbo.employee where employee_id=?
   Hibernate: delete from bdqn.dbo.project where project_id=?

------------------------------------------------------------------------------------------------------------
<set name="employees" inverse="false" >
       <key>
             <column name="p_id" />
       </key>
       <one-to-many class="entity.Employee" />
</set>  

public void testInverse() {
    Session s = HibernateSessionFactory.getSession();
    Transaction t = s.beginTransaction();
    Project p = (Project) s.get(Project.class, 3);
    s.delete(p);
    t.commit();
}

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?
Hibernate: update bdqn.dbo.employee set p_id=null where p_id=?
Hibernate: delete from bdqn.dbo.project where project_id=?

 

 

 

----------------------------------------------------------------------------------------------------

           9                        e1                         employ1                          NULL              

           10                       e2                         employ2                          NULL              

          11                       e3                         employ3                          NULL              

          12                    e4                         employ4                          NULL              

----------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------
<set name="employees" inverse="false" cascade="delete">  
         <key>  
             <column name="p_id" />  
         </key>  
          <one-to-many class="entity.Employee" />  
</set>  

public void testInverse() {
    Session s = HibernateSessionFactory.getSession();
    Transaction t = s.beginTransaction();
    Project p = (Project) s.get(Project.class, 4);
    s.delete(p);
    t.commit();
}

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?
Hibernate: select employees0_.p_id as p2_1_, employees0_.employee_id as employee1_1_, employees0_.employee_id as employee1_0_0_, employees0_.p_id as p2_0_0_, employees0_.employee_name as employee3_0_0_, employees0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employees0_ where employees0_.p_id=?
Hibernate: update bdqn.dbo.employee set p_id=null where p_id=?
Hibernate: delete from bdqn.dbo.employee where employee_id=?
Hibernate: delete from bdqn.dbo.employee where employee_id=?
Hibernate: delete from bdqn.dbo.employee where employee_id=?
Hibernate: delete from bdqn.dbo.employee where employee_id=?
Hibernate: delete from bdqn.dbo.project where project_id=?

 

 

 

 

Hibernate: select project0_.project_id as project1_1_0_, project0_.project_name as project2_1_0_, project0_.project_desc as project3_1_0_ from bdqn.dbo.project project0_ where project0_.project_id=?
Hibernate: select employee0_.employee_id as employee1_0_0_, employee0_.p_id as p2_0_0_, employee0_.employee_name as employee3_0_0_, employee0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employee0_ where employee0_.employee_id=?
Hibernate: select employees0_.p_id as p2_1_, employees0_.employee_id as employee1_1_, employees0_.employee_id as employee1_0_0_, employees0_.p_id as p2_0_0_, employees0_.employee_name as employee3_0_0_, employees0_.employee_desc as employee4_0_0_ from bdqn.dbo.employee employees0_ where employees0_.p_id=?