ITPub博客

首页 > 应用开发 > Java > 初触hibernate03--持久态的纠结 1

初触hibernate03--持久态的纠结 1

原创 Java 作者:eBusinessMan 时间:2015-01-24 20:05:21 0 删除 编辑

Account类(属性):                                            

public class Account {

            public String accountNum;//账号号码 ,主键

            public Set subAccountSet = new HashSet();//SubAccount的Set集合

            }

Account类的配置文件:

       

           

           

       

      

                          

                          

 

 

 

SubAccount类:

public class SubAccount {

            public int subAccountId;  

            public String subAccountNum;   

public Account account; //外键

}

SubAccount类的配置文件:

   

       

           

       

       

       

   

由以上配置文件:Account和SubAccount是双向一对多关联

 

 

一下是我的一些验证:

public class HibernateUtil {

            public static SessionFactory sessionFactory = buildSessionFactory();

            private static SessionFactory buildSessionFactory(){

                       。。。。通过配置文件创建并返回sessionFactory对象

            }

            public static SessionFactory getSessionFactory(){

                       return sessionFactory;

            }

            public static void main(String[] args) {

                       // TODO Auto-generated method stub

                       SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

                       Session session = sessionFactory.openSession();

                       session.beginTransaction();

            //创建一个Account对象account

                       Account account = new Account();

                       account.setAccountNum("143331");

            //创建一个SubAccount对象subAccount

                       SubAccount subAccount = new SubAccount();

                       subAccount.setSubAccountNum("0201");

            //和account建立关联

                       subAccount.setAccount(account);

                       //保存subAccount,按照配置文件,所以account也会被级联保存,即是说account转化为持久态

                       session.save(subAccount);

                      

            //创建一个SubAccount对象subAccount2

                       SubAccount subAccount2 = new SubAccount();

                       subAccount2.setSubAccountNum("1211");

            //和account建立关联

                       subAccount2.setAccount(account);

            //保存subAccount,由于account处于持久态,所以不会再保存account

                       session.save(subAccount2);

                      

                       /**上面没有account.getSubAccountSet().add(subAccount)和account.getSubAccountSet().add(subAccount2),

                       但是,由于account处于持久态,所以按理说:以下迭代从account中的Set中应该可以取出数据时----

                       就是,session应该会发出sql语句到数据库中取出来。可是没有,这可以从运行后

                       会发现,account.getSubAccountSet().size() == 0,Set集合中没有SubAccount对象

                       */

                       for(SubAccount subAccount3:account.getSubAccountSet()){

                                   System.out.println("account中set的元素对象的属性SubAccountNum的值:"+subAccount3.getSubAccountNum());

                       }

                       System.out.println("account中set中的元素个数:"+account.getSubAccountSet().size());

                       session.getTransaction().commit();

                      

                       session.beginTransaction();

                      

                       /**

                       于是我尝试以相同的主键get出一个Account对象

                       */

                       //查看此时account2中set的元素

                       Account account2 = (Account) session.get(Account.class, "143331");

                       /**以下运行后,

                       会发现,account.getSubAccountSet().size() == 0,Set集合中没有SubAccount对象

                       */

                       System.out.println("account中set的元素个数:"+account.getSubAccountSet().size());

                       for(SubAccount subAccount3:account.getSubAccountSet()){

                                   System.out.println("account中set的元素对象的属性SubAccountNum的值:"+subAccount3.getSubAccountNum());

                       }

                      

                       //后来我添加了以下测试代码,发现打印:account2 == account !!

                       if(account2 == account){//true!

                                   System.out.println("account2 == account");

                       }

                       session.getTransaction().commit();

                       /**

                       以上验证说明了:session缓存中有某一个对象,当再以主键去get这个对象的时候(session未关闭),

                       将会返回缓存中的同一个对象。

                       这样的话,是不是说:持久态的意思仅仅是:一个对象在session缓存中存在(数据库中也存在)就是处于持久态了,而当操作这个持久态对象去获取本对象的当前没有值而数据库中却有对应值的属性的时候(就例如save了account后,session缓存中的account的Set中是没有SubAccount对象的),session也不会去数据库中取出所要的属性值,而是直接把缓存对象中的属性值 当成 数据库中也是这个值 。

                       以上结论是否正确?

                       */

            }

}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29900383/viewspace-1413451/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-09-21

  • 博文量
    46
  • 访问量
    134910