下面是我现在学习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,应该如何做?
谢谢! 盼复!
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,应该如何做?
谢谢! 盼复!
解决方案 »
- 在使用struts2 radio标签时碰到一个问题
- java中正则表达式怎么匹配换行符,求助!!
- action错误
- 最近在做ssl项目,是不是生成一次客户端证书,服务端的tomcat.keystore就要变一次
- 面试的问题!
- struts下的jsp 异常 java.lang.NullPointerException
- 高分求救:axis2 client请求
- structs中实现文件上传。有兴趣的麻烦指导一下。
- BeanUtils.copyProperties(target, o) 抛出异常org.apache.commons.beanutils.ConversionException
- struts中一个页面如何显示多个FormBean?
- ssh2:saveOrUpdate时,怎么老是save啊?
- ssh2:两个关联表怎么同时插入数据啊?
当你用这种的时候。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来展现数据,而且是可以延时加载的那种?
按道理说应该是可以的。
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或文件中
那框架还有什么意义呢?数据的安全性怎么保证呢?问题太多 不能详细解释还有不懂得问。