扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
要创建一个数据对象并把它存入数据库中,你只需简单地使用Java的new关键字来创建POJO,并把它传给EntityManager.persist()方法。
Person p = new Person ();
p.setName ("A new baby");
p.setDateOfBirth (new Date ());
em.persist (p);
要从数据库中取得对象,你可以使用EJB 3.0查询语言来搜索数据库。下面的例子演示了如何将Person表中的所有行作为Person Java对象的集合来返回。
// 得到所有人的对象
Collection <Person> persons = (Collection <Person>)
em.createQuery("from Person p").getResultList();
可管理的POJO
通过实体管理器保存和获取的对象是被管理在持久化上下文中的。这意味着如果对象后来被改变了,那这种改变将会被自动检测并持久化到数据库中。在下面的例子中,我们更新了一个可管理的POJO的一个属性。这个改变会被EJB 3.0容 器自动检测到并发送给了数据。
Person p = em.find(Person.class, personId);
p.setName ("Another Name");
//p会在当前事务结束时被自动地更新到数据库中去。
// 并没用更多的API调用
既然EJB 3.0实体仅只是POJO,那么它们就可以能够被序列化并通过网络传递。如果一个对象不是被容器创建的(也就是说,它是从网络连接中传递过来的或者是某一个远程调用返回的结果),那么持久化上下文并不会管理它。不过,你可以通过调用EntityManager.merge()方法将一个非管理的POJO合并到持久化上下文中。下面是将一个解序列化的POJO合并入当前持久化上下文中的例子。
InputStream in;
// 初始化输入流
Person p = Util.deserialize (in);
// ... ...
em.merge (p);
// p现在是一个可管理的对象了。p的任何改变将会被自动检测并持久化
p.setName ("Another Name");
数据库同步
当实体管理器对象在一个session bean中使用时,它是和服务器的事务上下文绑定的。实体管理器在服务器的事务提交时提交并且同步它的内容。在一个session bean中,服务器的事务默认地会在调用堆栈的最后提交。当然,你也可以通过注释来为每个商务方法指定具体的事务属性。下面的例子展示了如何为一个session bean的方法声明一个新的事务。
@TransactionAttribute(TransactionAttributeType.REQUIRESNEW)
public void update () {
// 这个方法更新Person对象
// 更新将会在这个方法的末尾被提交和刷新到数据库中
批处理中刷新数据库操作
为了只在当事务提交时才将改变更新到数据库中,容器将所有数据库操作集中到一个批处理中,这样就减少了代价昂贵的与数据库的交互。
如果你需要在事务提交之前将更新刷新到数据库中,你可以直接地调用EntityManager.flush()方法。或者你可以将一个方法注释为@FlushMode(FlushModeType.NEVER),于是事务管理器将不会在方法的结尾(也就是事务的结尾)处刷新更新到数据库中。这种情况下,你可以手工地来刷新数据库以获得对数据库操作的最大控制。
总结
EJB 3.0 提供了一种简单有效的框架将Java POJO映射到SQL数据库中的关系型表中。它基于Java类中的名字和结构进行智能的默认映射策略。但你也可以用一组简单的注释重载所有的默认值,来处理复杂的对象关系。
EJB 3.0实体管理器提供了简单的API来持久化和从数据库中查找对象。每一个实体管理器对象与一组映射的POJO相关联,并有着它自己的数据库设置。它会自动地捆绑到服务器的事务管理器中。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者