实体BEAN的关联
今天自己写了一个例子,有关实体BEAN的关联问题,我写的这个例子是一对多的情况,一是人,多是狗,一个人可以养多条狗,每条狗都必须有一个主
人,在删除主人的时候,狗就没有存在的必要了,所以狗也要跟着删除,可是删除狗的时候,主人却可以在.一开始我实现的时候,删除狗的操作是错误的,我以为
直接把Person里面的Dog删掉,然后更新Person就可以了,谁知不是这样的,你在增加了Person中的狗的时候,你更新Person就可以把
狗加进来了,可是当你把Person里面的狗删除掉时,再更新Person,数据库里面的狗却不会少.而要你显示的调用em.remove()去删除你想
删除的狗,并且你对这狗不能设置为级联删除,否则你删除狗的时候把人也删掉了,这当然不是我们希望看到的.
下面附上代码
<!---->package com.hadeslee.session;
import com.hadeslee.entity.Person;
import java.util.List;
import javax.ejb.Remote;
/**
* This is the business interface for PersonDAO enterprise bean.
*/
@Remote
public interface PersonDAORemote {
public void insertPerson(Person p);
public List getAllPersons();
public Person findPerson(long id);
public void deletePerson(long id);
}
<!----> package com.hadeslee.session;
import com.hadeslee.entity.Dog;
import com.hadeslee.entity.Person;
import java.util.List;
import javax.ejb.Remote;
/**
* This is the business interface for PersonToDogs enterprise bean.
*/
@Remote
public interface PersonToDogsRemote extends PersonDAORemote{
public void addDog(Person p,Dog dog);
public Person removeDog(Person p,Dog dog);
public List getDogs(Person p);
public Person getOwner(Dog dog);
}
<!----> /*
* PersonDAOBean.java
*
* Created on 2006年12月13日, 下午3:53
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.hadeslee.session;
import com.hadeslee.entity.Person;
import java.util.List;
import javax.ejb.Stateful;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
/**
*
* @author lbf
*/
@Stateful
public class PersonDAOBean implements com.hadeslee.session.PersonDAORemote {
@PersistenceContext
protected EntityManager em;
/** Creates a new instance of PersonDAOBean */
public PersonDAOBean() {
}
public void insertPerson(Person p) {
em.persist(p);
System.out.println("保存成功");
}
public List getAllPersons() {
Query query=em.createQuery("select p from Person p order by p.id");
return query.getResultList();
}
public Person findPerson(long id) {
return em.find(Person.class,id);
}
public void deletePerson(long id){
em.remove(em.find(Person.class,id));
}
}
<!----> 1. /*
2. * PersonToDogsBean.java
3. *
4. * Created on 2006年12月13日, 下午4:50
5. *
6. * To change this template, choose Tools | Template Manager
7. * and open the template in the editor.
8. */
9.
10. package com.hadeslee.session;
11.
12. import com.hadeslee.entity.Dog;
13. import com.hadeslee.entity.Person;
14. import java.util.List;
15. import javax.ejb.Stateless;
16. import javax.persistence.Query;
17.
18. /**
19. *
20. * @author lbf
21. */
22. @Stateless
23. public class PersonToDogsBean extends PersonDAOBean implements com.hadeslee.session.PersonToDogsRemote {
24.
25. /** Creates a new instance of PersonToDogsBean */
26. public PersonToDogsBean() {
27. }
28.
29. public void addDog(Person p, Dog dog) {
30. p.addDog(dog);
31. em.merge(p);
32. }
33.
34. public Person removeDog(Person p, Dog dog) {
35. //em.remove(dog);
36. p.removeDog(dog);
37. System.out.println("此时P的大小是:"+p.getDogs().size());
38. em.merge(p);
39. return p;
40. }
41.
42. public List getDogs(Person p) {
43. return p.getDogs();
44. }
45.
46. public Person getOwner(Dog dog) {
47. Query query=em.createQuery("select p from Person p where p.id=?1");
48. query.setParameter(1,dog.getOwner().getId());
49. return (Person)query.getSingleResult();
50. }
51.
52. }
目前的代码是不能正常删除的,要正常删除狗的话,必须把em.remove() 那句话还原,然把再把em.merge()那句话注释起来才行
还有一个现象,那就是我在对远程对象进行了操作以后,并不会反映到我的本地对象,比如我调用了删除人里面的一条狗,在远程或者在数据库里面确实是删
掉了,可是我在调用人的时候,里面还是有那么的狗,这样就会产生不同步的现象,为了消除这种现象,我把接口写了一个,改为进行了删除操作的时候,它会再次
返回Person对象,这个时候就可以保证远程对象和本地对象的一致性了.
增加代码没写,所以每次增加了狗后,调用Person对象时,依然是增加前一样的,也就是说,当我持有了远程对象发过来的本地对象后,如果我不对其
进行操作,无论你怎么调用远程方法,此方法会对其有影响的,JVM都不会返回一个最新的给你,而你用的永远是第一次传过来的那个以象,所以,在远程对象传
输中,必须要注意同步性,要么就每次都从远程去取最新的对象,要么就先对本地对象做同样的操作,比如前面的addDog动作,先在本地执行一遍,然后远程
执行远程的,这样就可以同步了,不过我觉得如果是网络允许的情况下,还是每次对对象操作后都能返回最新的对象好一些,免得手工去保持和远程对象的同步,这
样不可靠.
一对多目前只看到了这么多,接下来要看一下多对多的情况.
分享到:
相关推荐
**企业级JavaBeans(EJB)初学者指南** 企业级JavaBeans(EJB)是Java平台上用于构建可扩展、安全且事务处理能力强的企业级应用程序的核心技术。EJB规范定义了一组组件模型,允许开发人员创建分布式、多层的服务器...
6. **EJB的依赖注入** EJB支持依赖注入(Dependency Injection),使得组件可以通过接口而不是硬编码的方式获取其他服务。这增强了组件的可测试性和可维护性。 7. **EJB与JPA(Java Persistence API)** EJB 3.0...
### EJB初学者常有的十一个疑惑解析 #### 一、EJB与Java Bean的区别 在探讨EJB与Java Bean的区别之前,我们首先需要明确两者的基本概念。 **Java Bean**: - **定义**:Java Bean是一种可重用的组件,没有严格的...
通过这个ejb的初学者教程,学习者可以了解到如何创建、配置、调用和部署EJB,从而更好地理解和利用Java EE平台的强大功能。随着对EJB的深入理解,开发者能够构建出更健壮、可扩展的企业级应用。
本源代码主要向EJB初学者介绍JMS的使用,如何创建和初始化一个请求Requestor对象、如何初始化请求Requestor对象、如何建立一个会话和发送请求、如何打印出请求的过程信息、如何接受由反馈者replier发回的消息等。
### EJB学习笔记第六部分详解 #### 一、EJB之间的调用 EJB (Enterprise JavaBeans) 是Java EE平台中用于开发分布式企业应用程序的重要组件。在实际开发过程中,经常需要一个EJB调用另一个EJB来实现更复杂的业务...
### EJB 3.0 初学者必备知识点详解 #### 一、EJB 3.0 概述 **EJB (Enterprise JavaBeans)** 是Java平台为企业级应用程序提供的一种组件模型,它允许开发者以模块化的方式构建分布式网络计算的应用程序。EJB 3.0...
### 实战EJB知识点解析 #### 一、企业JavaBeans (EJB) 技术概览 **什么是企业JavaBeans技术?** 企业JavaBeans (EJB) 是Java平台上的服务器端组件模型,专为构建可扩展、可靠且跨平台的企业级应用程序而设计。...
### EJB3 最新学习教程知识点详解 #### 一、EJB3 概念与特点 **企业级JavaBean(EJB)**是Java...通过以上内容的学习,初学者可以系统地了解EJB3的核心概念、开发流程及高级特性,为进一步深入学习打下坚实的基础。
第1篇对EJB编程基础进行介绍,它概要性地对EJB进行了阐述,无论是EJB初学者,还是资深EJB专家,这部分内容都值得阅读;第2篇重点关注EJB编程的具体内容和过程,其中,研究了如何开发如下三种EJB组件:会话Bean、实体Bean和...
本书内容翔实、深入浅出,提供了详细的讨论和实例,对于懂Java语言的EJB初学者是一本有益的指导书。本书所附光盘包括:WebLogic Server 6.1的试用版、WebGain's VisualCafe 4.5的试用版、 WebGain's TopLink 3.5.1的...
### EJB技术详解 #### EJB 2.0与EJB 1.1的主要区别及其应用场景 EJB(Enterprise JavaBeans)技术自1998年首次推出以来,经历了多个版本的演进,其中EJB 2.0是EJB 1.1的重要升级版,带来了诸多改进和新特性,旨在...
- `ejb-3_0-fr-spec-simplified.pdf`:这个版本可能提供了一个简化的EJB3.0规范概述,方便初学者快速理解EJB3.0的关键特性。 通过深入学习这些文档,开发者可以全面掌握EJB3.0规范,有效提升在Java企业级应用开发中...
Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax....
**EJB3(Enterprise JavaBeans 3)是Java EE(Enterprise Edition)平台中用于构建企业级应用程序的重要组件模型。这个PPT教程详细介绍了EJB3的各种...无论是对于初学者还是经验丰富的开发者,这都是一份宝贵的资源。
对于初学者,理解EJB与Java Bean的区别至关重要。Java Bean是一种可重用的组件,它遵循一定的编码规范,如拥有无参构造器和实现Serializable接口。Java Bean通常在本地进程中使用,而EJB是分布式组件,可以跨越进程...
"简单易懂"表明这个EJB示例可能采用了清晰的代码结构,简单的业务逻辑,以及良好的注释,使得初学者也能快速理解其工作方式和设计思路。 综上所述,EJB_TEST是一个帮助学习者理解和实践EJB技术的示例项目,涵盖了...
6. **ejb samp项目**: 这个ejb samp项目很可能包含了一个或多个EJB组件的源代码,可能是会话bean或实体bean。源码会展示如何定义bean的接口和实现类,以及如何配置部署描述符。初学者可以通过阅读和运行这些示例来...
javax.ejb.AccessLocalException.class javax.ejb.CreateException.class javax.ejb.DuplicateKeyException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb....