20070704
----------------------------
JSF中的javaBean的数据成员为一个javaBean的时候,记住一定要初始化!
20070706
----------------------------
java包的结构,自己的理解:包里的函数靠接口(interface)提供给外界信息,proxy是对interface的实现,但不是具体的实现,而且做一些初始化工作,如消息预处理。
Implement是真正对接口的实现。
____|interface|_______
| | 接口 | |
| 『 代理proxy 』 |
| 『 实现Impl 』 |
| |
|___________________|
ods元数据管理平台的技术架构为如下:
视图采用 jsf和tiles框架---->jsp |
|-> 视图层采用JSF和tiles框架
支撑页面为BackingBean ---->BB 获取页面属性,验证信息,调用 UCC |
用例层 为 UserUseCase ---->UCC 为BB和Bs之间的桥梁(此处不是很理解|
到底UCC起到什么作用,难道是所谓的 |-> 业务层采用spring框架
Proxy?),调用BS |
|
业务逻辑层BussinessService->BS 具体的业务逻辑,调用DAO |
数据存储层DataAccessObject->DAO 负责与数据库打交道并调用BO |
|-> 视图层采用hibernate框架
业务实体类BussinessObject-->Bo 为业务实体类,它对应于数据库表 |
20070707
----------------------------
面向对象的编程就是面向接口的编程,接口一定要慎重理解!
补充一下漏记的部分,javadoc命令可以根据你的注视自动生成文档,native2ascii命令可以将本地文字转换成asc值。
20070713
----------------------------
spring 的Ioc 和Aoc的理解:
IoC即控制反转,其实就是DI依赖注入,它的意思就是将对象的生成由Bean本事管理转到由Spring 来统一管理,
即在Bean中不用再写Object ob=new Object();这样的语句,由spring 帮bean生成并注入到bean中,即你需要的时候它就给你注入进去,注入
依靠两种方式,即setter和构造方法注入。目前我这个项目基本都是用setter方法注入。即你bean中的对象属性想要由spring给你注入,首先
必须写好getter和setter方法。然后在spring 的XML配置文件中配上要注入的属性对象,如下
xml 代码
- <bean id="pubStruChangeQueryService" class="cn.ccb.metadata.app.bs.structure.PubStruChangeQueryService" >
- <property name="dao" >
- <ref bean="baseDAO" />
- </property>
- <property name="service" >
- <ref bean="structureService" />
- </property>
- </bean>
以上property即属性,你bean的属性,ref bean="xx",指属性所对应的bean,该bean中的class指定了类路径。
对Aoc的理解竟停留在字面理解上,实际操作还有待日后去实践。
Aoc即面向方面的编程,其思想就是要把需要重复写的代码作为一个切面。把它抽取出来,实现代码间的模块化?自己的理解。
有个例子即,你在写jdbc的时候,要反复写查找驱动,得到一个连接,写SQL语句,执行语句,然后释放连接。等等,Aoc就把
这个繁琐的重复动作给抽取出来,你只要关注写SQL就好了,还有如事务,日志等等。。这些东西也要配在spring的XML文件中
xml 代码
- <bean id="codeManageUCCProxy"
- class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <property name="transactionManager">
- <ref bean="metadataTransactionManager"/>
- </property>
- <property name="proxyInterfaces">
- <list>
- <value>cn.ccb.metadata.app.ucc.systemCode.ICodeManageUcc</value>
- </list>
- </property>
- <property name="target">
- <ref local="codeManageUcc"/>
- </property>
- <property name="transactionAttributes">
- <props>
- <prop key="insert*">PROPAGATION_REQUIRES_NEW,-RollbackableBizException</prop>
- <prop key="update*">PROPAGATION_REQUIRES_NEW,-RollbackableBizException</prop>
- <prop key="delete*">PROPAGATION_REQUIRES_NEW,-RollbackableBizException</prop>
- <prop key="query*">PROPAGATION_REQUIRES_NEW,readOnly</prop>
- <prop key="save*">PROPAGATION_REQUIRES_NEW,-RollbackableBizException</prop>
- </props>
- </property>
- </bean>
以上我抽出的配置是对事务的控制。prop key="xx*" 还支持通配符定义了做这些函数动作的时候,就调用这个事务控制。
今天还了解了一下AJAX技术(Asynchronous JavaScript and XML)异步的页面刷新技术,当一个页面展现给客户的时候,需要更新页面某个地方的时候
不需要从服务器中把这个页面整个传过来,只需将要更新的部分传过来即可。
这个东西以前有做过,不过不是用它的包,但是做法应该是类似的,就是用xml做传输数据的载体。这个东西还是很好的,加快web的更新浏览速度。用人家
的专门的框架做应该会更好,不过java框架也太他妈多了,做java程序员真命苦,天天要update自己的知识,不然又落后了。
20070717
----------------------------
今天搞了一天搞定两个问题。
第一个问题:不同类名相同属性的pojo类 对象之间的拷贝。虽然两个类的属性完全一样但是不能用 a=b的方式,或者类型强制转换会报ClassCastException的异常。
看似简单的问题,却要写一个转换函数才能实现。
后来用了java的反射机制写了一个pojo类属性的拷贝函数。该函数由网上载的。
java 代码
- public Object CopyBo(Object obj1, Object obj2) throws Exception {
- Method[] method1 = obj1.getClass().getMethods();
- Method[] method2 = obj2.getClass().getMethods();
- String methodName1;
- String methodFix1;
- String methodName2;
- String methodFix2;
- for (int i = 0; i < method1.length; i++) {
- methodName1 = method1[i].getName();
- methodFix1 = methodName1.substring(3, methodName1.length());
- if (methodName1.startsWith("get")) {
- for (int j = 0; j < method2.length; j++) {
- methodName2 = method2[j].getName();
- methodFix2 = methodName2.substring(3, methodName2.length());
- if (methodName2.startsWith("set")) {
- if (methodFix2.equals(methodFix1)) {
- Object[] objs1 = new Object[0];
- Object[] objs2 = new Object[1];
- objs2[0] = method1[i].invoke(obj1, objs1);
- method2[j].invoke(obj2, objs2);
- continue;
- }
- }
- }
- }
- }
- return obj2;
- }
第二个问题:
在使用hibernate的save函数时报
identifier of an instance of cn.ccb.metadata.app.bo.TbapStructureDetailPubhis was altered from 402885d813d337320113d3e983d1005e to 402885d813d337320113d36320dd0026;
nested exception is org.hibernate.HibernateException:
identifier of an instance of cn.ccb.metadata.app.bo.TbapStructureDetailPubhis was altered from 402885d813d337320113d3e983d1005e to 402885d813d337320113d36320dd0026;
这个错误是由于我在循环保存bo的时候,没有重新实例化要保存的bo,比如
java 代码
- for(int j=0;j<details.size();j++){
- TbapStructureDetail detailBo = new TbapStructureDetail();
- detailPubhisBo = new TbapStructureDetailPubhis();
- detailBo=(TbapStructureDetail)details.get(j);
- detailPubhisBo = (TbapStructureDetailPubhis)CopyBo(detailBo,detailPubhisBo);
- detailPubhisBo.setStruAttributeId(struPubhisBo.getStruAttributeId());
- detailPubhisBo.setStructureDetailId(null);
- this.dao.save(detailPubhisBo);
- }
-
20070723
----------------------------
Oracle分区表学习及应用
分区分hash、range、list和复合分区。
sql 代码
-
-
- create table BILL_MONTHFEE_ZERO
-
- (
-
- SERV_ID NUMBER(20) not null,
-
- BILLING_CYCLE_MONTH NUMBER(6) not null,
-
- DATE_TYPE NUMBER(1),
-
- ACC_NBR VARCHAR2(80)
-
- )
-
- partition by range (BILLING_CYCLE_MONTH)
-
- (partition p_200407 values less than (200407)
-
- tablespace TS_ZIKEN
-
- storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),
-
- partition p_200408 values less than (200408)
-
- tablespace TS_ZIKEN
-
- storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0))
-
- ;
-
- create index idx_bill_monthfee_zero_idx01 on bill_monthfee_zero(billing_cycle_month)
-
- tablespace TS_ZIKEN_idx
-
- storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0) nologging;
-
- grant all on bill_monthfee_zero to dxsq_dev;
-
-
-
- alter table BILL_MONTHFEE_ZERO add Partition p_200409
-
- values less than (200409) tablespace ts_ziken;
-
-
-
- alter table part_tbl drop Partition part_tbl_08;
-
-
-
- alter table bill_monthfee_zero split Partition p_200409 at (200409)
-
- into (Partition p_200409_1 tablespace ts_ziken,
-
- Partition p_200409_2 tablespace ts_ziken_idx);
-
-
-
- ALTER TABLE bill_monthfee_zero
-
- MERGE PARTITIONS p_200408, p_200409 INTO PARTITION p_all
-
-
-
- alter table bill_monthfee_zero rename Partition p_200408 to p_fee_200408
-
-
-
- alter table bill_monthfee_zero move Partition p_200409
-
- tablespace ts_ziken_01 nologging
-
-
-
- select count(*) from BILL_MONTHFEE_ZERO partition (p_200407);
-
-
-
- insert into bill_monthfee_zero select * from bill_monthfee_zero partition (p_200407)
-
-
-
- userid=dxsq/teledoone@jndxsq154
-
- buffer=102400
-
- tables=bill_monthfee:P_200401,
-
- file=E:\exp_para\exp_dxsq_tables.dmp
-
- log=E:\exp_para\exp_dxsq_tables.log
-
技巧:
删除表中一个字段:
alter table bill_monthfee_zero set unused column date_type;
添加一个字段:alter table bill_monthfee_zero add date_type number(1);