Java JPA中的EntityManager详解

需积分: 14 2 下载量 58 浏览量 更新于2024-09-13 收藏 19KB DOCX 举报
"EntityManager是Java JPA中的核心接口,用于管理实体对象的生命周期,执行CRUD操作,并且处理与数据库的交互。它由EJB容器自动管理,无需开发者手动创建。在SessionBean或MDBBean中,可以使用依赖注入的方式获取EntityManager实例,通过@PersistenceContext注解来实现。如果persistence.xml中有多个持久化单元,需要指定unitName。EntityManager能够跟踪实体的状态变化,一旦实体脱离管理,其状态变化将不会被同步到数据库。常用API包括find()、getReference()、以及各种CRUD操作。" 在Java企业级应用开发中,Java Persistence API (JPA) 提供了一种标准的方式来处理对象关系映射(ORM),使得Java开发者可以方便地在应用程序中操作数据库。`EntityManager`是JPA的核心组件,它提供了与数据库交互的接口,负责管理应用程序中的实体对象(Entity)。实体对象是JPA中的模型类,它们代表数据库中的表。 1. **获取EntityManager实例**: `@PersistenceContext` 是一个JSR 220(EJB 3.0)注解,用于注入`EntityManager`实例。在SessionBean或Message-Driven Bean(MDB)中,通过这个注解可以直接得到`EntityManager`,无需手动创建。如果`persistence.xml`文件中配置了多个持久化单元(`<persistence-unit>`),需要使用`unitName`属性来指定要注入的特定持久化单元。 2. **实体状态管理**: `EntityManager`能够跟踪实体对象的状态,这些状态包括:新建(New)、持久化(Managed)、游离(Detached)和删除(Removed)。当实体处于持久化状态时,它的任何更改都会在适当的时间同步到数据库。一旦实体变为游离状态,`EntityManager`将不再监控其状态变化,需要手动调用`merge()`方法将其重新关联到管理状态。 3. **常用API**: - **find()**: 通过主键获取实体对象,如果数据库中不存在对应记录,返回`null`。 - **getReference()**: 也通过主键获取实体引用,即使数据库中不存在记录也会返回一个未初始化的引用,当试图访问其属性时可能会抛出`EntityNotFoundException`。 - **persist()**: 将新实体保存到数据库。 - **merge()**: 更新已存在的实体,将实体的当前状态与数据库中的状态同步。 - **remove()**: 删除实体,从数据库中移除对应的记录。 - **flush()**: 强制将所有未提交的更改写入数据库。 - **clear()**: 从`EntityManager`中清除所有实体,使它们成为游离状态。 - **createQuery()**: 创建JPA的查询语句,支持JPQL(Java Persistence Query Language)。 除了这些基本操作,`EntityManager`还提供了事务管理和事件监听等高级功能。在实际开发中,`EntityManager`的使用能够极大地简化数据访问层的代码,提高代码的可读性和可维护性,同时遵循Java EE的规范,易于与其他企业级服务集成。
2010-09-07 上传
第一次写博客,那是因为我想与大家分享.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爱好者探讨啦,希望你有更好的思路