下面是我现在学习ssh中的测试中部分类代码 UserEntity.java 
public class UserEntity {   
    private Long id;   
    @Column(name = "id", nullable = false, insertable = true, updatable = true, length = 20, precision = 0)   
    @Id  
    public Long getId() {return id;}   
    public void setId(Long id) {this.id = id;}   
  
    private String username;   
    @Column(name = "username", nullable = true, insertable = true, updatable = true, length = 20, precision = 0)   
    @Basic  
    public String getUsername() {return username;}   
    public void setUsername(String username) {this.username = username;}   
  
    private AccountEntity account;   
    @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY)   
    @PrimaryKeyJoinColumn  
    public AccountEntity getAccount() {return account;}   
    public void setAccount(AccountEntity account) {this.account = account;}   
}  public class UserEntity {
    private Long id;
    @Column(name = "id", nullable = false, insertable = true, updatable = true, length = 20, precision = 0)
    @Id
    public Long getId() {return id;}
    public void setId(Long id) {this.id = id;} private String username;
    @Column(name = "username", nullable = true, insertable = true, updatable = true, length = 20, precision = 0)
    @Basic
    public String getUsername() {return username;}
public void setUsername(String username) {this.username = username;}    private AccountEntity account;
    @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
    @PrimaryKeyJoinColumn
    public AccountEntity getAccount() {return account;}
    public void setAccount(AccountEntity account) {this.account = account;}
}
applicationContext.xml  
...   
    <bean id="transactionProxyFactory" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">   
        <property name="transactionManager" ref="transactionManager"/>   
        <property name="transactionAttributes">   
            <props>   
                <prop key="*">PROPAGATION_REQUIRED</prop>   
            </props>   
        </property>   
    </bean>   
  
    <bean id="userService" parent="transactionProxyFactory">   
        <property name="target" ref="userServiceTarget"/>   
    </bean>   
  
    <bean id="userServiceTarget" class="com.test.web.service.UserService">   
        <property name="userDao" ref="userDao"/>   
    </bean>   
...  
UserService.java  
public class UserService {   
    private UserDAOImpl userDao;   
  
    public UserEntity getUser(long id) {   
        UserEntity user = userDao.findById(id);   
        return user;   
    }   
  
    ......   
}  
UserAction.java ...
UserEntity user = userService.getUser(1l);
request.put("user", user);
...
-------------------------------------------------------------------- 我的问题: 
    1、如果就上面UserService中的代码,我在UserAction中调用getUser方法,hibernate是不会去 select 数据的,为什么? 
    2、如果UserService中,return user 之前加上 user.getUsername(); 则 hibernate会打印两条sql语句 
   第一条只是去读取UserEntity对应的表数据,第二条则是去关联读取account表数据 
   我觉得有 fetch=FetchType.LAZY 这个属性,应该是在 getAccount() 时才回去加载 account 表数据 
   为什么在 getUsername() 就加载了呢? 
3、在UserAction中得到的 UserEntity 对象,是不是已经不是一个PO了,它已经“死”了,也就是说Session是不是已经没了? 
4、现在这种模式,我能否在页面中用PO来展现数据,而且是可以延时加载的那种? 
5、我以前没有用事物的时候,是在Filter里进行 Session.close() 操作的,所以那个时候我可以把PO传到页面中读取数据 
   现在这种模式,如果不传递PO,应该如何做? 
谢谢! 盼复! 

解决方案 »

  1.   

    1、如果就上面UserService中的代码,我在UserAction中调用getUser方法,hibernate是不会去 select 数据的,为什么?
    当你用这种的时候。applicationContent.xml是否加载了?。你可以测试一下。userDao是否产生了实例.
    2、如果UserService中,return user 之前加上 user.getUsername(); 则 hibernate会打印两条sql语句 
      第一条只是去读取UserEntity对应的表数据,第二条则是去关联读取account表数据 
      我觉得有 fetch=FetchType.LAZY 这个属性,应该是在 getAccount() 时才回去加载 account 表数据 
      为什么在 getUsername() 就加载了呢? 
     UserEntity user = userDao.findById(id);   操作后会从对象的瞬时(get/load)状态改变为
    持久状态。在这个状态下你的操作以后都会和数据库进行同步。user.getUsername(); 时候会执行一条sql
    语句。
    3、在UserAction中得到的 UserEntity 对象,是不是已经不是一个PO了,它已经“死”了,也就是说Session是不是已经没了?
    close/evict/clear后持久状态变为脱管状态。
    Session已经没了。
    4、现在这种模式,我能否在页面中用PO来展现数据,而且是可以延时加载的那种? 
    按道理说应该是可以的。
      

  2.   

    楼主问题好多哦。。
      1,这个与你的代码有关。。
         既然你用了Spring 那里还在UserService里面定义userDao干嘛呢?
          直接由Spring来创建对象就好了
          ApplicationContext context=
         new ClassPathXmlApplicationContext("applicationContext.xml");
           UserDao userDao=(UserDao)context.getBean("userDao");
           UserEntity user = userDao.findById(id);
     2,您的配置里面没有设置延迟加载。
     3,你在Action中的Po是一个游离态对象可以通过方法把它重新变回持久态
     4,可以。。
     5,不用PO你怎么拿数据呢?PO是数据的载体 无论你用什么技术。
         不管你把PO放在集合中也罢。。最终页面上显示的还是这个PO
            如果没有PO你的数据从哪来呢?如果说把数据放在XML或文件中
               那框架还有什么意义呢?数据的安全性怎么保证呢?问题太多 不能详细解释还有不懂得问。