10-24
属性的访问策略(可以从class与property级别控制)
1> Property 默认方式get,set
2> Field 没有get,set方法用这个属性访问
3> Formula=”select sum(p.price)”:派生出来的
4> 控制一下update,与delete
5> 包
Hibernate 对象的标志,主键的生成策略
1. 表里面的记录 主键
Java对象对象的id 3333@3333
Hibernate (中间件) OID 标识别
Ts.commit----flush或clear操作
快照: session.get(.class,1)
---------------------------------------------------------------------------
2014-10-27
主键的生成策略:自然主键,代理主键id,组合主键
1.自动增长的(increment)查找最大值selectMax(id)加再1值
2.自动增长的(indentiry)自动增加,加1带走,底层数据库//先加再插入
3.native
4.assigned 由应用程序负责生成主键的
---------------------------------------------------------------------------
2014-10-29
不要使有关键字作为表的属性或字段
Transient:临时对象与持久化对象的管理,级联更新与保存
Hibernate的dynamic-insert和dynamic-update的使用
<property>元素 dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
<property>元素 dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
如果表中包含N多字段,建议把 dynamic-update属性和insert属性设置为true,这样在插入和修改数据的时候,语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时间,提高程序的运行效率.
多态是面向对象的核心之一,面向接口编程也是以面向对象编程为核心。多态就是父类或者接口的引用指向子类的对象的情况。多态主要一定要记得两段话,编译时看引用,运行时看对象。这句话的意思是在IDE编译阶段,你用f点出来的方法(f.这里会提示Father类有得实例方法)都是Fahter类自己有得,而Child类里自己有得方法不会被自动提示出来。但是如果子类重写父类的方法了(重写:就是子类定义了一个与父类一模一样的方法,只是方法体不同),运行时还要看后面new出来的是谁,new Child();那么执行要执行Child类重写的方法体,
抽象类跟接口的区别
1抽象类的成员可以具有访问级别,而接口的成员全部public级别
2抽象类可以包含字段,而接口不可以,
3抽象类可以继承接口,而接口不能继承抽象类
4抽象类的成员可以具有具体实现,而接口不行
5抽象的子类可以选择性实现其基类的抽象方法,而接口的子类必须实现
定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
对于多态,可以总结它为:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
cascade="all-delete-orphan": 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新-
inverse的意思是反转,用来设置关系哪一方是拥有者owner,由他来维护这个关系。
在一对多的关系中,包含Set/Collection 类实例是“一”,Set里面包含的类实例则是“多”的一方。可以理解为 Set/Collectin 是代码中一对多关系的表达,包含Set/Collection的类实例在没有设置inverse的时候是owner。
inverse="false" 是默认情况,此时没有反转,则 Set/Collection 关系由包含它的“一”这一方来维;inverse="true" 时,表示 Set/Collection 关系由另一方来维护,由不包含这个关系的一方来维护这个关系,所以才称为“反转”了。
easyUi
ligerUi
ssh,E
自己理解一下scope取值的范围单例vs原型,单例模式与工厂模式
面试宝典、java公司的面试题
记录你的学习项目日志,与csdn开博客,有空学习一上Oracle
Java转型
C3po的配置
例如定义切入点表达式 execution(*com.sample.service.impl..*.*(..))
execution()是最常用的切点函数,其语法如下所示:
整个表达式可以分为五个部分:
1、execution():表达式主体。
2、第一个*号:表示返回类型,*号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
@Service("userService"):
注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好 的"userService",然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入 的"userService"即可
注意:在Action声明的“userService”变量的类型必须是“UserServiceImpl”或者是其父类“UserService”,否则由于类型不一致而无法注入,由于Action中的声明的“userService”变量使用了@Resource注解去标注,并且指明了其name = "userService",这就等于告诉Spring,说我Action要实例化一个“userService”,你Spring快点帮我实例化好,然 后给我,当Spring看到userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做"userService"的UserServiceImpl的实例 注入给Action中的“userService”变量,帮助Action完成userService的实例化,这样在Action中就不用通过“UserService userService = new UserServiceImpl();”这种最原始的方式去实例化userService了。如果没有Spring,那么当Action需要使用UserServiceImpl时,必须通过“UserService userService = new UserServiceImpl();”主动去创建实例对象,但使用了Spring之后,Action要使用UserServiceImpl时,就不用主动去创建UserServiceImpl的实例了,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的 UserServiceImpl实例给Action,Action拿到就可以直接用了。Action由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Action,Action才能够使用。这说明 Action对“UserServiceImpl”类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用 “UserServiceImpl”类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去 new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权力已经被Spring拿走了,只有 Spring才能够new“UserServiceImpl”类的实例,而Action只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好的“UserServiceImpl”类的实例给他,这样他才能够使用“UserServiceImpl”,这就是Spring核心思想“控制反转”,也叫“依赖注入”,“依赖注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Acion需要依赖的UserServiceImpl注入(也就是“给”)给Action,这就是所谓的“依赖注入”。对Action而言,Action依赖什么东西,就请求Spring注入给他,对Spring而言,Action需要什么,Spring就主动注入给他。
@Autowired
Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
Spring 通过一个BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。
<load-on-startup>1</load-on-startup>
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2)它的值必须是一个整数,表示servlet应该被载入的顺序
2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
5)当值相同时,容器就会自己选择顺序来加载。
@Repository
我们就不再需要在 XML 中显式使用 <bean/> 进行Bean 的配置。Spring 在容器初始化时将自动扫描 base-package 指定的包及其子包下的所有 class文件,所有标注了 @Repository 的类都将被注册为 Spring Bean。
@RunWith:这个是指定使用的单元测试执行类,这里就指定的是SpringJUnit4ClassRunner.class;
@ContextConfiguration:这个指定Spring配置文件所在的路径,可以同时指定多个文件;
@TestExecutionListeners:这个用于指定在测试类执行之前,可以做的一些动作,如这里的 DependencyInjectionTestExecutionListener.class,就可以对一测试类中的依赖进行注 入,TransactionalTestExecutionListener.class用于对事务进行管理;这两个都是Srping自带的; 我们也可以实现自己的Listener类来完成我们自己的操作,只需要继续类 org.springframework.test.context.support.AbstractTestExecutionListener就可 以了,具体可以参照DependencyInjectionTestExecutionListener.class的实现,后面我会贴出实例。 Listener实在实现类执行之前被执行、实现类的测试方法之前被执行,这与Listener的实现有关。
@Transactional:这里的@Transactional不是必须的,这里是和@TestExecutionListeners中的 TransactionalTestExecutionListener.class配合使用,用于保证插入的数据库中的测试数据,在测试完后,事务回 滚,将插入的数据给删除掉,保证数据库的干净。如果没有显示的指定@Transactional,那么插入到数据库中的数据就是真实的插入了。
注:1、getSession()和getHibernateTemplate都可以自动释放连接(当然你的配置要正确),但是在一个线程内 getSession会get很多个session(就是开很多个会话、连接),很可能导致数据库连接超过上限。所以推荐使用 getHibernateTemplate。
2、如果有些语句无法用getHibernateTemplate实现,可以使用getHibernateTemplate.execute使用HibernateCallback回调接口。
ctrl+shift+x,ctrl+shift+y:eclipse里大小写转化的快捷键
<propertyname="hibernate.hbm2ddl.auto"> </property>
这个属性标签中有四个参数可以写,这四个参数是对数据库中插入的进行不同的操作,分别为:
(1)create-drop(2)create(3)update(4)validate
下面分别来介绍他们的作用以及对数据库中的影响
(1)<propertyname="hibernate.hbm2ddl.auto"> create-drop </property>
create-drop:表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用
(2)<property name="hibernate.hbm2ddl.auto">create</property>
在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格
(3)<property name="hibernate.hbm2ddl.auto">update</property>
只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构
(4)<property name="hibernate.hbm2ddl.auto">validate</property>
校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用
注:在使用的时候必须要慎重,我就是在当时学习的时候所设置的属性是validate,所以只要改了数据库名就会抛初始化异常,当时我郁闷了半天都不知道是怎么回事,没有往这方面想,后来才知到balidate是在没有数据库名的时候不让你创建,会抛异常的。