获取EntityManager

PersistenceContext是Java Persistence API中用于管理实体对象的状态和生命周期的一种机制。它包括transaction-scoped和extended两种类型,分别适用于不同的应用场景。transaction-scoped类型的PersistenceContext在事务结束后会自动关闭,而extended类型的PersistenceContext可以在更长的时间范围内保持打开状态。

Persistence Context

Persistence context是由一组受托管的实体对象实例所构成的集合。它受entity manager 的管理。Entity

manager追踪persistence context中所有对象的修改和更新情况,并根据指定的flush模式(本章稍后会做讨论

)将这些修改保存到数据库中。一旦persistence context被关闭,所有实体对象实例都会脱离EntityManager而

成为非托管对象。对象一旦从persistence context中脱离,就不再受entity manager管理了,任何对此对象的

状态变更也将不会被同步到数据库。


Java Persistence中有两种类型的persistence context,分别是transaction-scoped persistence context和

extended persistence context。

Transaction-scoped persistence context
的persistence context可能只在事务范围内存在,它们会在事务结束后被关闭。
当事务结束时,transaction-scoped persistence context将被销毁,而所有的托管实体对象实例也将处于游离

状态(detached)。只有受应用服务器管理的persistence context才可以是事务范围的。换言之,只有标注了

@PersistenceContext注解(或是其XML的等价描述)的EntityManager实例才可以是事务范围的。

EJB 3.0中,由于持久对象在脱离persistence context之后将自动变成值对象,因此也就没必要再使用Value Object模式模式了。EJB 2.1的代码中时常使用Value Object模式(也被称为Data Transfer Objects)。该模式的主要思想是:让entity bean暴露一个方法,该方法将bean的全部状态复制到一个对象中,此对象可以被序列化到远程客户端(比如Swing应用程序),以供远程客户端访问。

package javax.persistence;

public enum PersistenceContextType

{

   TRANSACTION,

   EXTENDED

}

public @interface PersistenceProperty {

   String name();

   String value();

}

@Target({METHOD, TYPE, FIELD}) @Retention(RUNTIME)

public @interface PersistenceContext {

   String name() default "";

   String unitName() default "";

   PersistenceContextType type() default TRANSACTION;

   PersistenceProperty[] properties() default {};

}

@PersistenceContext与@PersistenceUnit的作用相仿,唯一的不同在于,注入的是EntityManager实例而非

EntityManagerFactory。

类型为EXTENDED的EntityManager只能注入到stateful session bean中。由于stateless session bean和

message-driven bean是被缓存的,因而无法关闭persistence context,也无法释放任何受托管的实体实例。一

个stateful session bean可以使用type属性为EXTENDED的@javax.persistence.PersistenceContext注解来获取

extended context。
如果在EJB中应用Java Persistence,我们强烈建议你使用@Persi- stenceContext注解或等价的XML描述。因为

这些功能的目的便是让开发人员更加方便的使用entity bean。相比之下,使用EntityManagerFactory创建

EntityManager则因为需要关注更多琐碎的细节而更容易出错。例如,开发人员可能会因为忘记调用close()方法

关闭entity manager而导致资源泄漏。请充分利用EJB容器提供给你的便捷设施! 

第一次写博客,那是因为我想与大家分享.Net世界.我原来是ASP程序员,与.Net结缘那是在两年多前.第一次接触它,就喜欢上了.哈哈 接着我给大家分享一下我在项目中用到的数据访问层,这个是我用微软网站上得到的DBHepler数据库访问层的一次改编,让它支持实体类和用表达 式的方式生成SQL,而且更关键的是,他是采用参数的方式传值的,这样就避免了SQL的注入啦.. 以下是这个项目的结构 [SuperDAL] ---DbHelper.cs(来自MSDN的数据访问层) ---EntityManager.cs(实体类管理) ---Expressions.cs(实体类表达式查询) ---Expression.cs(实体类表达式) ---OrderByExpressions.cs(排序表达式查询) ---OrderByExpression.cs(排序表达式) ---ObjectValues -------OrderBy.cs(排序枚举类) ---DBManager.cs(数据访问类管理) ---DbParams.cs(数据库访问类参数) ---DataTableExtensions.cs(这个就是顾名思义啦,DataTable传实体类) 在这里最主要介绍的就是EntityManager这个啦,使用方法如下: 有数据库DB的一张表Customs CREATE TABLE [Customs] ( [Name] [varchar] (20) , [Password] [varchar] (20) , [Email] [varchar] (50) , [Phone] [varchar] (11) NULL , [Old] [int] , [Birthday] [DateTime] ) 有个实体类Customs.cs,结构如下: public class Customs { public string Name {get;set;} public string Password {get;set;} public string Email {get;set;} public string Phone {get;set;} public int Old{get;set} public DateTime Brithday {get;set;} } 数据库表与实体Customs结构是一一对应的.有了实体类CUstoms,下面就可以操作实体类跟操作数据库一样的啦,我们新建一个实体类管理类 CustomsManager.cs public class CustomsManager:EntityManager { public Customs GetByName(string name) { //创建表达式Expressions Expressions exps=new Expressions(); //向表达式添加条件 exps.Eq("name",name); //根据条件查询返回实体类 return EM_GetUnique(exps); } public List SearchByName(string name) { //同样像上面一样建立表达式类 Expressions exps=new Expressions(); exps.Like("name",name);//当然,有年朋友会说如果我要姓为"陈"的,那有些人的名字带陈的怎么办,没关系,可以改为 exps.LeftLike ("name",name); //根据条件查询返回实体类 return EM_GetEntity(exps); } /// /// 登录 /// /// 用户名 /// 密码 public List Login(string name,string password) { Expressions exps=new Expressions(); exps.Eq("name",name); exps.Eq("password",password); return EM_GetEntity(exps); } /// /// 选择年龄大于指定岁数的,并按年龄从小到大排序 /// /// 年龄 public List SelectOlder(int old) { Expressions exps=new Expressions(); exps.Gt("old",old); exp.OrderBys.Add("old", OrderBy.Asc); return EM_GetEntity(exps); } /// /// 选择年龄大于小于指定岁数段的,并按年龄从小到大,姓名从字母升序排序 /// /// 年龄 public List SelectByOld(int oldStart,int oldend) { Expressions exps=new Expressions(); exps.Between("old",oldStart,oldEnd); exp.OrderBys.Add("old", OrderBy.Asc); exp.OrderBys.Add("name",OrderBy.Asc); return EM_GetEntity(exps); } #region 增删改 操作 /// /// 更新操作 /// /// 实体类 public int Update(Customs customs) { return EM_Save(customs);//返回更新的记录数,当然,一般成功执行就会返回1;也可以改上面为public void Update(Customs customs) } /// /// 删除操作 /// /// public int DeleteByName(string name) { Expressions exps=new Expressions(); exps.Eq("name",name); return EM_Delete(exps); } /// /// 删除操作 /// /// 实体类 public int Save(Customs custom) { return EM_Save(custom); } #endregion } 当然还有更多的也就不一一贴出来了 Expressions支持的表达式有 1. Eq (等于)[name=value] 2. NotEq (不等于)[not name = value] 3. Ge (大于等于)[name >=value] 4. Gt (大于)[name>value] 5. Le (小于等于)[name<=value] 6. Lt (小于)[name<value] 7. In (包括)[name in (value)] 8. NotIn (不包括)[not name in (value) 9. IsNotNull (不为NULL)[not name is null] 10. IsNull (等于NULL)[name is null] 11. Between (之间)[name between valueStart and valueEnd] 12. Like (模糊) [name like ‘%value%’ ] 13. LeftLike (左模糊) [name like ‘%value’] 14. RightLike (右模糊) [name like ‘value%’] 其它功能待与Net爱好者探讨啦,希望你有更好的思路
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值