??xml version="1.0" encoding="utf-8" standalone="yes"?>
1.Hibernate session接口的get和loadҎ有何异同Q?
{: get不到实体对象时会q回nullQload会抛出异?br />
- get会立卛_载实体对象,load默认是gq加?br />
- get会忽略二U缓?q个没有试验q?Qload则是一U和二~存都?
2.在持久化层,对象分ؓ哪些状态?分别列出?
{?瞬时?Transient)、持久?Persistent)、脱?Detached)?
瞬时?Transient)
是对象是创徏Ӟ瞬时对象在内存孤立存在,它是携带信息的蝲体,不和数据库的数据有Q何关联关p,在Hibernate中,可通过session的save()?saveOrUpdate()Ҏ瞬时对象与数据库相兌Qƈ数据对应的插入数据库中Q此时该瞬时对象转变成持久化对象?
持久?Persistent)
是该对象在数据库中已有对应的记录Qƈ拥有一个持久化标识Q如果是用hibernate的delete()ҎQ对应的持久对象变成瞬时对象,因数据库中的对应数据已被删除Q该对象不再与数据库的记录关联?
当一个session执行close()或clear()、evict()之后Q持久对象变成脱对象,此时持久对象会变成脱对象,此时该对象虽然具有数据库识别|但它已不在hibernate持久层的理之下?
持久对象h如下特点Q?
1. 和session实例兌Q?
2. 在数据库中有与之兌的记录?
q?Detached)
当与某持久对象关联的session被关闭后Q该持久对象转变对象。当q对象被重新关联到session上时Qƈ再次转变成持久对象?
q对象拥有数据库的识别|可通过update()、saveOrUpdate(){方法,转变成持久对象?
q对象h如下特点Q?
1.本质上与瞬时对象相同Q在没有M变量引用它时QJVM会在适当的时候将它回Ӟ
2. 比瞬时对象多了一个数据库记录标识倹{?
3.lock和update区别
{? update是把一个已l更改过的脱状态的对象变成持久状?
lock是把一个没有更改过的脱状态的对象变成持久状?针对的是因Session的关?而处于脱状态的po对象(2)Q不能针对因delete而处于脱状态的po对象)
对应更改一个记录的内容Q两个的操作不同Q?
update的操作步骤是Q?
(1)属性改动后的脱的对象的修?>调用update
lock的操作步骤是Q?
(2)调用lock把未修改的对象从q状态变成持久状?->更改持久状态的对象的内?->{待flush或者手动flush
4.save 和update区别
{: save是把一个对象做Z个新的数据保? update则是把一个脱状态的对象或自由态对象(一定要和一个记录对应)更新到数据库Q其实一个是保存一个是更新Q一看都知道是有什么区别了?
5.update 和saveOrUpdate区别
{:q个是比较好理解的,思义QsaveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一D话来解释他们的使用场合和区?
通常下面的场景会使用update()或saveOrUpdate()Q?
E序在第一个session中加载对?接着把session关闭
该对象被传递到表现?
对象发生了一些改?
该对象被q回C务逻辑层最l到持久?
E序创徏W二session调用W二个session的update()Ҏ持久q些改动
saveOrUpdate(po)做下面的?
如果该po对象已经在本session中持久化了,在本session中执行saveOrUpdate不做M?
如果savaOrUpdate(新po)与另一个与本session兌的po对象拥有相同的持久化标识(identifier)Q抛Z个异?
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]
saveOrUpdate如果对象没有持久化标?identifier)属性,对其调用save() Q否则update() q个对象
6.flush和update区别
{:q两个的区别好理解update操作的是在自由态或q状?因session的关闭而处于脱状?的对?/updateSQL
而flush是操作的在持久状态的对象?
默认情况下,一个持久状态的对象的改动(包含set容器Q是不需要update的,只要你更改了对象的|{待hibernate flushp动更新或保存到数据库了。hibernate flush发生在以下几U情况中Q?
1Q?调用某些查询的和手动flush(),session的关闭、SessionFactory关闭l合
get()一个对象,把对象的属性进行改?把资源关闭?
2Qtransaction commit的时候(包含了flushQ?
]]>
代理模式的作用是Q?/p>
为其他对象提供一U代理以控制对这个对象的讉K。在某些情况下,一个客户不x者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用?/p>
代理模式一般涉及到的角色有Q?
抽象角色Q声明真实对象和代理对象的共同接口;
代理角色Q代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在Q何时刻都能代替真实对象。同Ӟ代理对象可以在执行真实对象操作时Q附加其他的操作Q相当于对真实对象进行封装?/p>
真实角色Q代理角色所代表的真实对象,是我们最l要引用的对象?/p>
以下以《Java与模式》中的示例ؓ例:
代码Q?//抽象角色Q?br />
abstract public class Subject{
abstract public void request();
}
//真实角色Q实CSubject的request()Ҏ?br />
public class RealSubject extends Subject{
public RealSubject(){
}
public void request(){
System.out.println("From real subject.");
}
}
//代理角色Q?br />
public class ProxySubject extends Subject{
private RealSubject realSubject; //以真实角色作Z理角色的属?
public ProxySubject(){
}
public void request(){ //该方法封装了真实对象的requestҎ
preRequest();
if( realSubject == null ){
realSubject = new RealSubject();
}
realSubject.request(); //此处执行真实对象的requestҎ
postRequest();
}
private void preRequest(){
//something you want to do before requesting
}
private void postRequest(){
//something you want to do after requesting
}
}
//客户端调用:
Subject sub=new ProxySubject();
Sub.request();
׃上代码可以看出,客户实际需要调用的是RealSubjectcȝrequest()ҎQ现在用ProxySubject来代理RealSubjectc,同样辑ֈ目的Q同时还装了其他方?preRequest(),postRequest())Q可以处理一些其他问题?
另外Q如果要按照上述的方法用代理模式,那么真实角色必须是事先已l存在的Qƈ其作ؓ代理对象的内部属性。但是实际用时Q一个真实角色必d应一个代理角Ԍ如果大量使用会导致类的急剧膨胀Q此外,如果事先q不知道真实角色Q该如何使用代理呢?q个问题可以通过Java的动态代理类来解冟?/p>
2.动态代?/p>
Java动态代理类位于Java.lang.reflect包下Q一般主要涉及到以下两个c:
(1). Interface InvocationHandlerQ该接口中仅定义了一个方法ObjectQinvoke(Object obj,Method method, Object[] args)。在实际使用ӞW一个参数obj一般是指代理类Qmethod是被代理的方法,如上例中的request()QargsҎ的参数数l。这个抽象方法在代理cM动态实现?/p>
(2).ProxyQ该cd为动态代理类Q作用类g上例中的ProxySubjectQ其中主要包含以下内容:
Protected Proxy(InvocationHandler h)Q构造函敎ͼ估计用于l内部的h赋倹{?/p>
Static Class getProxyClass (ClassLoader loader, Class[] interfaces)Q获得一个代理类Q其中loader是类装蝲器,interfaces是真实类所拥有的全部接口的数组?/p>
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)Q返回代理类的一个实例,q回后的代理cd以当作被代理cM?可用被代理cȝ在Subject接口中声明过的方??/p>
所谓Dynamic Proxy是这样一UclassQ它是在q行时生成的classQ在生成它时你必L供一linterfacel它Q然后该class宣U它实现了这些interface。你当然可以把该class的实例当作这些interface中的M一个来用。当然啦Q这个Dynamic Proxy其实是一个ProxyQ它不会替你作实质性的工作Q在生成它的实例时你必须提供一个handlerQ由它接实际的工作?参见文献3)
在用动态代理类Ӟ我们必须实现InvocationHandler接口Q以W一节中的示例ؓ例:
代码Q?//抽象角色(之前是抽象类Q此处应改ؓ接口)Q?/p>
public interface Subject{
public void request();
}
//具体角色RealSubjectQ实CSubject接口的request()Ҏ?br />
public class RealSubject implements Subject{
public RealSubject(){
}
public void request(){
System.out.println("From real subject.");
}
}
//代理角色Q?br />
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
public class DynamicSubject implements InvocationHandler{
private Object sub;
public DynamicSubject(Object sub){
this.sub = sub;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before calling " + method);
method.invoke(sub,args);
System.out.println("after calling " + method);
return null;
}
}
该代理类的内部属性ؓObjectc,实际使用旉过该类的构造函数DynamicSubject(Object sub)对其赋|此外Q在该类q实CinvokeҎQ该Ҏ中的"method.invoke(sub,args)" 其实是调用被代理对象的要被执行的ҎQ方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。通过动态代理类Q我们可以在调用之前或之后执行一些相x作?
客户端:
代码Q?import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Client{
static public void main(String[] args) throws Throwable{
RealSubject rs = new RealSubject(); //在这里指定被代理c?br />
InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
Class cls = rs.getClass();
//以下是分解步?br />
/*
Class c = Proxy.getProxyClass(cls.getClassLoader(),cls.getInterfaces());
Constructor ct=c.getConstructor(new Class[]{InvocationHandler.class});
Subject subject =(Subject) ct.newInstance(new Object[]{ds});
*/
//以下是一ơ性生?/p>
Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds);
subject.request();
}
通过q种方式Q被代理的对?RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变Q控制的方式(DynamicSubjectc?也可以动态改变,从而实C非常灉|的动态代理关pR?
3.代理模式使用原因和应用方?/p>
Q?Q授权机?不同U别的用户对同一对象拥有不同的访问权?如Jive论坛pȝ?׃用Proxyq行授权机制控制,讉K论坛有两Uh:注册用户和游?未注册用?,Jive中就通过cMForumProxyq样的代理来控制q两U用户对论坛的访问权?
Q?Q某个客L不能直接操作到某个对?但又必须和那个对象有所互动.
举例两个具体情况:
如果那个对象是一个是很大的图?需要花费很长时间才能显C出?那么当这个图片包含在文档中时,使用~辑器或览器打开q个文档,打开文档必须很迅?不能{待大图片处理完?q时需要做个图片Proxy来代替真正的囄.
如果那个对象在Internet的某个远端服务器?直接操作q个对象因ؓ|络速度原因可能比较?那我们可以先用Proxy来代曉K个对?
M原则?对于开销很大的对?只有在用它时才创徏,q个原则可以为我们节省很多宝늚Java内存. 所?有些为Java耗费资源内存,我以和程序编制思\也有一定的关系.
Q?Q现实中QProxy应用范围很广,现在行的分布计方式RMI和Corba{都是Proxy模式的应?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/goodHabit/archive/2009/11/08/4784461.aspx
q是META最常见的用?在制作网|,在纯HTML代码下都会看到它,它v的作用是定义你网늚语言,当访客浏览你的网|,览器会自动识别q设|网?nbsp; 中的语言,如果你网设|的是GB?而访客没有安装GB?q时|页只会呈现访客人所讄的浏览器默认语言。同L,如果该网|p,那么 charset=en?
META可以讄|页到期的时?也就是说,当你在Internet Explorer 4.0览器中讄览|页旉先查看本地缓冲里的页?那么当浏览某一|页,而本地缓冲又有时,那么览器会自动览~冲区里的页?直到META中设 |的旉到期,q时?览器才会去取得新页面?
scheme=″...″ META信息的图解?