今天自己写了一个例子,有关实体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;
-
-
-
-
-
- @Remote
- public interface PersonDAORemote {
- public void insertPerson(Person p);
- public List getAllPersons();
- public Person findPerson(long id);
- public void deletePerson(long id);
- }
java 代码
-
- package com.hadeslee.session;
-
- import com.hadeslee.entity.Dog;
- import com.hadeslee.entity.Person;
- import java.util.List;
- import javax.ejb.Remote;
-
-
-
-
-
- @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);
- }
java 代码
-
-
-
-
-
-
-
-
-
- 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;
-
-
-
-
-
- @Stateful
- public class PersonDAOBean implements com.hadeslee.session.PersonDAORemote {
- @PersistenceContext
- protected EntityManager em;
-
- 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));
- }
-
- }
java 代码
-
-
-
-
-
-
-
-
-
- package com.hadeslee.session;
-
- import com.hadeslee.entity.Dog;
- import com.hadeslee.entity.Person;
- import java.util.List;
- import javax.ejb.Stateless;
- import javax.persistence.Query;
-
-
-
-
-
- @Stateless
- public class PersonToDogsBean extends PersonDAOBean implements com.hadeslee.session.PersonToDogsRemote {
-
-
- public PersonToDogsBean() {
- }
-
- public void addDog(Person p, Dog dog) {
- p.addDog(dog);
- em.merge(p);
- }
-
- public Person removeDog(Person p, Dog dog) {
-
- p.removeDog(dog);
- System.out.println("此时P的大小是:"+p.getDogs().size());
- em.merge(p);
- return p;
- }
-
- public List getDogs(Person p) {
- return p.getDogs();
- }
-
- public Person getOwner(Dog dog) {
- Query query=em.createQuery("select p from Person p where p.id=?1");
- query.setParameter(1,dog.getOwner().getId());
- return (Person)query.getSingleResult();
- }
-
- }
目前的代码是不能正常删除的,要正常删除狗的话,必须把em.remove() 那句话还原,然把再把em.merge()那句话注释起来才行
还有一个现象,那就是我在对远程对象进行了操作以后,并不会反映到我的本地对象,比如我调用了删除人里面的一条狗,在远程或者在数据库里面确实是删掉了,可是我在调用人的时候,里面还是有那么的狗,这样就会产生不同步的现象,为了消除这种现象,我把接口写了一个,改为进行了删除操作的时候,它会再次返回Person对象,这个时候就可以保证远程对象和本地对象的一致性了.
增加代码没写,所以每次增加了狗后,调用Person对象时,依然是增加前一样的,也就是说,当我持有了远程对象发过来的本地对象后,如果我不对其进行操作,无论你怎么调用远程方法,此方法会对其有影响的,JVM都不会返回一个最新的给你,而你用的永远是第一次传过来的那个以象,所以,在远程对象传输中,必须要注意同步性,要么就每次都从远程去取最新的对象,要么就先对本地对象做同样的操作,比如前面的addDog动作,先在本地执行一遍,然后远程执行远程的,这样就可以同步了,不过我觉得如果是网络允许的情况下,还是每次对对象操作后都能返回最新的对象好一些,免得手工去保持和远程对象的同步,这样不可靠.
一对多目前只看到了这么多,接下来要看一下多对多的情况.
分享到:
相关推荐
实体Bean(Entity Bean)是EJB的一种类型,它代表业务逻辑中的持久化对象,通常映射到数据库中的表。本篇文章将深入探讨EJB实体Bean的概念、其在Eclipse集成开发环境中的使用,以及与MySQL数据库的集成。 ### 一、...
本篇文章将深入探讨在JBoss应用服务器上开发EJB应用,特别是实体Bean的使用。 标题:“Jboss下开发ejb应用之一实体bean的应用” 首先,理解EJB实体Bean的含义至关重要。实体Bean代表持久化的业务对象,它们与...
`CascadeType`枚举提供了MERGE、CREATE、REMOVE和ALL等选项,以决定何时同步更新关联的实体Bean。 此外,EJB 3.0还支持`@ManyToOne`(多对一)、`@OneToOne`(一对一)和`@ManyToMany`(多对多)关系,它们同样通过...
2. **Container-managed Persistence (CMP)**:容器负责对象与数据库之间的持久化工作,开发者无需直接处理数据库操作,只需定义实体Bean的字段和属性。 3. **Entity Beans 3.0(EJB 3.0引入)**:简化了Entity Bean...
在数据库中,实体Bean通常代表表中的行,而实体间的级联关系则反映了表之间的关联。级联操作确保了对一个实体的特定操作会影响到与其关联的其他实体。 `cascade()`注解是用来设置级联关系的,通过它我们可以定义当...
除了基本的CRUD操作,单表实体Bean还可以配合其他JPA特性,如懒加载(Lazy Loading)、级联操作(Cascading)、关联(Association)等,来实现更复杂的数据管理需求。例如,一个用户可能有多个角色,那么我们可以...
描述一个实体Bean可以与多个其他实体Bean关联。 **3.9 JPQL查询** JPQL是一种面向对象的查询语言,用于执行复杂的查询。 **3.9.1 命名参数查询** 使用`:`符号后跟参数名称的方式指定查询参数。 **3.9.2 位置...
### Java Persistence API (JPA) 与 EJB 3.0 实体 Bean 注解详解 #### 一、JPA 概述与实体 Bean 的转变 Java Persistence API (JPA) 是 Java 社区规范 JSR-220 的一部分,旨在提供一种标准的方式来处理对象与关系...
在Java EE应用开发中,实体Bean(Entity Bean)是一种核心组件,用于表示数据库中的数据对象。这个主题“10_开发单表映射的实体bean”聚焦于如何将数据库单表的数据映射到Java对象,以便在应用程序中进行操作。在本...
本教程聚焦于EJB 3,特别是第10讲,主要讲解如何开发单表映射的实体Bean。在本篇详细解答中,我们将深入探讨EJB 3中的实体Bean及其与数据库单表映射的关系。 首先,实体Bean是EJB的一种类型,代表业务逻辑中的持久...
在EJB3中,实体Bean不再需要编写大量的接口和实现代码,而是利用注解(Annotations)来定义其行为和属性,大大减少了代码量。 2. **JPA和Hibernate** EJB3的实体Bean通常与Java Persistence API (JPA)一起使用,...
在EJB中,事务通常与实体bean关联,实体bean的方法默认运行在特定的事务上下文中,根据方法的声明,容器会自动管理事务的开始、提交或回滚。 例如,在BMPEntity中,如果一个方法需要更新数据库,容器会在方法调用...
**企业级JavaBeans(EJB)2.0实体Bean**是Java平台中用于构建可部署在企业级服务器上的分布式、事务处理和持久性应用程序的重要组件。这个PDF文档,"EJB2.0 Entity bean",可能包含了关于如何设计、实现和使用EJB2.0...
**JPA学习源码(EJB实体Bean)** Java Persistence API(JPA)是Java平台上的一个标准,用于管理和持久化对象。它简化了在关系数据库中存储和检索Java对象的过程,是JAVA EE5中引入的重要组件。JPA通过提供ORM(对象...
【EJB3.0 PPT】深入解析实体Bean与消息驱动Bean EJB(Enterprise JavaBeans)3.0是Java企业级应用开发的核心组件之一,主要用于构建可复用、可扩展且具有高度分布式特性的服务。本篇主要关注EJB3.0中的两个关键组件...
本文档主要介绍了在Java EJB3环境中,如何实现三种不同类型的Bean:实体Bean(Entity Bean)、会话Bean(Session Bean)和消息驱动Bean(Message-Driven Bean)。 1. 开发环境: - **MyEclipse 7.0**:这是一个...
这些组件包括会话Bean(Session Bean)和实体Bean(Entity Bean),它们分别负责处理业务逻辑和数据持久化。 ##### 2.2 持久性和实体Bean 实体Bean是EJB 3.0中的一个关键概念,用于表示数据库中的持久化对象。EJB ...
EJB 3引入了JPA(Java Persistence API),使得实体Bean的定义和管理更加简单,不再需要编写大量的XML配置文件。通过使用@Entity注解,开发者可以直接将Java类声明为数据库中的实体,并使用@NamedQuery或@Query来...