计算机二级java资料.docx
《计算机二级java资料.docx》由会员分享,可在线阅读,更多相关《计算机二级java资料.docx(82页珍藏版)》请在冰豆网上搜索。
计算机二级java资料
Eclipse+JBoss+EJB3的SessionBean注释方法
有时需要在SessionBean中初始化和释放一些资源。
这些工作应该在SessionBean的@PostConstruct和@PreDestroy方法中进行。
其中用@PostConstruct注释的方法在SessionBean的构造方法调用之后以后EJB容器在处理完一些其他工作后调用。
用@PreDestroy注释的方法在SessionBean的对象实例被EJB容器销毁之前调用。
除此之外,当有状态的SessionBean存在一定时间未被调用时,EJB容器会将该SessionBean对象钝化(Passivate),也就是保存在硬盘中。
当再次访问时,EJB容器会激法该SessionBean。
在这两种情况下,EJB容器会分别调用SessionBean的@PrePassivate和@PostActivate方法。
可以在@PrePassivate方法中将sessionbean中的资源保存或释放,如打开的数据库连接等。
在@PostActivate方法中可以恢复相应的资源。
如下面的代码所示:
package service;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.PostActivate;
import javax.ejb.PrePassivate;
import javax.ejb.SessionContext;
import javax.ejb.Stateful;
@Stateless
public class ShoppingCartBean implements ShoppingCart
{
private List shoppingCart = new ArrayList();
@Resource
private SessionContext sessionContext;
public ShoppingCartBean()
{
System.out.println("constructor:
" + sessionContext);
}
@PrePassivate
public void MyPassivate()
{
System.out.println("passivate");
}
@PostConstruct
public void init()
{
System.out.println(sessionContext.getInvokedBusinessInterface());
}
@PreDestroy
public void destory()
{
System.out.println("destory");
}
@PostActivate
public void start()
{
System.out.println("start");
}
@Override
public void addCommodity(String value)
{
shoppingCart.add(value);
}
@Override
public List getCommodity()
{
return shoppingCart;
}
}
hibernate关系映射
对象-关系映射基础
1.对象间的基本关系
关联关系:
关联关系在设计模式中是被提倡优先使用于继承关系的。
关联关系就是将一个对象做为别一个对象的成员,是一种包含的关系。
依赖关系:
对与对象之间的方法的调用,不存在包含的关系。
聚集关系:
这个关系比较有趣,比如人的手和身体。
如果身体不存在了,手也就不存在了。
是一种整个与部分的关系。
一般关系:
就是继承关系。
上边的这四种关系是对前一天的补充。
对象-关系的映射基础没有涉及这些,而是单一对象通过hibernate与数据库的映射关系。
2.持久化类的属性及访问方法
首先回顾一下持久化,我们知道持久化层是从业务逻辑层中分离出来的专门用于数据库操作的这些部分。
持久化层中的持久化类,便是我们之前早已学习的domain类。
1).持久化类的访问者有两个,一是JAVA应用程序,二是hibernate。
写:
Java应用程序通过setter设置持久化对象的属性,hibernate通过getter获取持久化对象的属性并生成相应的SQL语句对表格进行操作。
读:
hibernate通过setter设置持久化对象的属性,Java应用程序通过getter获取持久化对象的属性。
2).基本数据类型和包装类型
通过前天的日志,我们知道关联对象的属性与表格的字段是通过property元素节点设置的:
基本的type是hibernate的类型,我们在持久化类中定义的gender属性为int。
定义为int类型会有什么弊端?
比如,我们有个学生成绩表。
如果某个学生没有参加某一学科的考试,但我们却使用了int类型,它的默认值为0,当查看学生成绩时,他到底是考了0分还是没有考试?
所以最好将持久化类中的gender属性定义为Integer,它的默认值为null。
查询成绩时看到的是null,那么他肯定是没参加考试哦!
(注意:
数据库中的对应字段应该为字符型)
3).hibernate访问持久化类属性的策略
Hibernate通过name指定的值访问持久化对象。
Hibernate通过name值,反射持久化对象的对方法。
比如,name的值为gender。
Hibernate会直接反射持久化对象的getGender和setGender方法。
所以我们必须保证持久化对象中有对应的方法。
这是因为property有一个access属性,它的默认值为property。
如果指定access的值为field,则hibernate直接根据name值反射持久化对象的属性。
此时,我们必须保证持久化对象中有对应的属性。
4).在持久化类的方法中加入程序逻辑
通过3)我们知道,如果access的值为property,hibernate直接反射持久化对象的方法。
在这个方法中我们就可以加入程序逻辑。
老徐举了一个生动的例子,比如Customer类中有firstname和lastname两个属性。
但我们只想让hibernate通过getName方法获得一个firstname+lastname的字符串,此时我们就可以在getName方法中将firstname与lastname两个属性值合并为一个中间使用“.”连接的字符串返回。
使用hibernate获取数据表中的数据时,hibernate会调用持久化对象的setName方法。
我们在这个方法中将传递进来的参数使用“.”分隔,然后分别设置到firestname和lastname属性中。
5).hibernate的hql语句
我们在使用JDBC、DBUtil时使用的都是SQL语句。
但hibernate比较特殊,它使用的是自己的一套东西叫hql语句。
比如我们调用session.find方法,传递的hql语句为:
"fromcustomerascwherec.name='itcast'"
其中的customer指向持久化对象的映射文件,name指向持久化对象的映射文件中的property元素的name属性。
此时需要注意access属性的值。
6).设置派生属性
Property元素中,有一个formula属性。
它的值是一个sql表达式,hibernate将根据此表达式计算的值设置到持久化对象的属性上。
比如,我们要统计订单表中的总计:
Hibernate一对多单向关系
1. 数据库schema
Teachers表:
createtableTEACHERS
(
ID NUMBER(10)notnull,
TEACHERNAMEVARCHAR2(15)
)
altertableTEACHERS
addconstraintDEREprimarykey(ID)
Students表:
createtableSTUDENTS
(
ID NUMBER(10)notnull,
STUDENTNAMEVARCHAR2(15),
TEACHER_ID NUMBER(10)
)
altertableSTUDENTS
addconstraintREREprimarykey(ID)
altertableSTUDENTS
addconstraintFFFforeignkey(TEACHER_ID)
referencesTEACHERS(ID);
2. Teacher.java和Student.java
Teacher.java
packagemypack;
publicclassTeacher{
//教师id
privateLongid;
//教师名称
privateStringteacherName;
/**
*缺省构造函数
*/
publicTeacher(){
}
/**
*得到教师id
*@returnLong 教师id
*/
publicLonggetId(){
returnid;
}
/**
*设置教师id
*@paramidLong 教师id
*/
publicvoidsetId(Longid){
this.id=id;
}
/**
*得到教师名称
*@returnString 教师名称
*/
publicStringgetTeacherName(){
returnteacherName;
}
/**
*设置教师名称
*@paramteacherNameString 教师名称
*/
publicvoi