EJB实体Bean开发的一对多关系映射

六、EJB实体Bean开发的一对多关系映射

1、在JBoss中配置数据源

方法见四、EJB实体Bean开发

并且保证JBoss中有该数据库连接jar包,例如:

2、建立项目

 

 

 

 

 

 

3、在persitence.xml中配置数据源连接

配置完成后会在EJB端项目中创建一个META-INF/persitence.xml文件,在该文件中进行连接等配置

(1)配置数据源

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence

    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

   

    <persistence-unit name="mysql" transaction-type="JTA">

        <jta-data-source>java:jdbc/mysql</jta-data-source>

    </persistence-unit>

 

</persistence>

(2)打开show_sql

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence

    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

   

    <persistence-unit name="mysql" transaction-type="JTA">

        <jta-data-source>java:jdbc/mysql</jta-data-source>

        <properties>

           <property name="hibernate.show_sql" value="true"/>

        </properties>

    </persistence-unit>

 

</persistence>

 

4、生成EntityBean映射

DROP TABLE person ;

DROP TABLE groups ;

 

CREATE TABLE groups (

    id                int               primary key auto_increment ,

    title             varchar(20)          not null ,

    description          text              not null

);

 

CREATE TABLE person (

    uid               varchar(18)          primary key ,

    name              varchar(20)          not null,

    age               int               not null,

    gid               int               not null,

    foreign key (gid) references groups (id) on delete cascade

);

 

 

 

 

package org.mldn.lin.entity;

 

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.Table;

 

@Entity

@Table(name = "person", catalog = "testdb", uniqueConstraints = {})

public class Person implements java.io.Serializable {

    private String uid;

 

    private Groups groups;

 

    private String name;

 

    private Integer age;

 

    public Person() {

    }

 

    public Person(String uid, Groups groups, String name, Integer age) {

       this.uid = uid;

       this.groups = groups;

       this.name = name;

       this.age = age;

    }

 

    @Id

    @Column(name = "uid", unique = true, nullable = false, insertable = true, updatable = true, length = 18)

    public String getUid() {

       return this.uid;

    }

 

    public void setUid(String uid) {

       this.uid = uid;

    }

 

    // 表示该类与Groups类有多对一关系

    // cascade表示级联关系,是否同时进行操作,与hibernate中的cascade相同,如果不写任何内容表示none值,如果填写可以从CascadeType的enum中选择适合的方式

    // fetch表示加载方式,如果值为LAZY表示使用延迟加载,如果为EAGER表示不使用

    @ManyToOne(cascade = {}, fetch = FetchType.LAZY)

    // 表示关系字段的映射配置

    @JoinColumn(name = "gid", unique = false, nullable = false, insertable = true, updatable = true)

    public Groups getGroups() {

       return this.groups;

    }

 

    public void setGroups(Groups groups) {

       this.groups = groups;

    }

 

    @Column(name = "name", unique = false, nullable = false, insertable = true, updatable = true, length = 20)

    public String getName() {

       return this.name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

 

    @Column(name = "age", unique = false, nullable = false, insertable = true, updatable = true)

    public Integer getAge() {

       return this.age;

    }

 

    public void setAge(Integer age) {

       this.age = age;

    }

 

}

package org.mldn.lin.entity;

 

import java.util.HashSet;

import java.util.Set;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.Id;

import javax.persistence.OneToMany;

import javax.persistence.Table;

 

@Entity

@Table(name = "groups", catalog = "testdb", uniqueConstraints = {})

public class Groups implements java.io.Serializable {

 

    private Integer id;

 

    private String title;

 

    private String description;

 

    private Set<Person> persons = new HashSet<Person>(0);

 

    public Groups() {

    }

 

    public Groups(Integer id, String title, String description) {

       this.id = id;

       this.title = title;

       this.description = description;

    }

 

    public Groups(Integer id, String title, String description,

           Set<Person> persons) {

       this.id = id;

       this.title = title;

       this.description = description;

       this.persons = persons;

    }

 

    @Id

//自增长

    @GeneratedValue

    @Column(name = "id", unique = true, nullable = false, insertable = true, updatable = true)

    public Integer getId() {

       return this.id;

    }

 

    public void setId(Integer id) {

       this.id = id;

    }

 

    @Column(name = "title", unique = false, nullable = false, insertable = true, updatable = true, length = 20)

    public String getTitle() {

       return this.title;

    }

 

    public void setTitle(String title) {

       this.title = title;

    }

 

    @Column(name = "description", unique = false, nullable = false, insertable = true, updatable = true, length = 65535)

    public String getDescription() {

       return this.description;

    }

 

    public void setDescription(String description) {

       this.description = description;

    }

    //表示该类与Person包含一对多关系,在对方对象中也包含一个对应的属性叫groups

    @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy = "groups")

    public Set<Person> getPersons() {

       return this.persons;

    }

 

    public void setPersons(Set<Person> persons) {

       this.persons = persons;

    }

 

}

 

5、新建SessionBean操作EntityBean

srcànewàEJB3 SessionBean

 

package org.mldn.lin.session;

 

import javax.ejb.Remote;

 

import org.mldn.lin.entity.Person;

 

@Remote

public interface PersonDAORemote {

    public boolean doCreate(Person person)throws Exception;

    public Person findById(String uid)throws Exception;

}

 

package org.mldn.lin.session;

 

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

 

import org.mldn.lin.entity.Person;

 

@Stateless

public class PersonDAO implements PersonDAORemote {

 

    @PersistenceContext

    private EntityManager em;

    public boolean doCreate(Person person) throws Exception {

       // TODO Auto-generated method stub

       this.em.persist(person);

       return true;

    }

 

    public Person findById(String uid) throws Exception {

       // TODO Auto-generated method stub

       Person person=this.em.find(Person.class, uid);

       return person;

    }

   

}

 

package org.mldn.lin.session;

 

import javax.ejb.Remote;

 

import org.mldn.lin.entity.Groups;

 

@Remote

public interface GroupsDAORemote {

    public boolean doCreate(Groups groups)throws Exception;

    public Groups findById(int gid)throws Exception;

}

 

package org.mldn.lin.session;

 

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

 

import org.mldn.lin.entity.Groups;

 

@Stateless

public class GroupsDAO implements GroupsDAORemote {

   

    @PersistenceContext

    private EntityManager em;

   

    public boolean doCreate(Groups groups) throws Exception {

       // TODO Auto-generated method stub

       this.em.persist(groups);

       return true;

    }

 

    public Groups findById(int gid) throws Exception {

       // TODO Auto-generated method stub

       Groups groups=this.em.find(Groups.class, gid);

       return groups;

    }

 

}

 

6、EJB端项目发布

 

7、在Web端建立测试类测试

通过测试类进行测试,需要将 拷贝到lib下即可

package org.mldn.lin.test;

 

import java.util.Properties;

 

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

 

import org.mldn.lin.entity.Groups;

import org.mldn.lin.session.GroupsDAORemote;

import org.mldn.lin.session.PersonDAORemote;

 

public class Test {

 

    public static void main(String[] args) {

       // 定义查找参数,通过定义这些参数找到该公共空间

       Properties pro = new Properties();

        pro.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");

       pro.setProperty("java.naming.provider.url", "192.168.1.187:1099");

       pro.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");

       // 通过JNDI查找发布的接口

       try {

           Context ctx = new InitialContext(pro);

 

           // 开始查找接口

           GroupsDAORemote gdao=(GroupsDAORemote) ctx.lookup("GroupsDAO/remote");

          

           Groups groups=new Groups();

           groups.setTitle("111");

          

           // 打印结果

           System.out.println(gdao.doCreate(groups));

 

       } catch (NamingException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

 

    }

 

}

 

8、处理jar包

此处采用测试类测试,而且因为有映射关系,所以会出现缺少支持类的错误,因此这里需要将用到的Hibernate3支持包拷贝到web端的lib下

对应的再查找所有需要用到的支持包,都包含以下内容:

, ,

在JBoss的D:\jboss-4.2.0.GA\server\default\lib目录下可以找到这些jar包,如果对于映射关系还不满足,那么可以在原来的SSH项目中找到完整版的Hibernate3的支持jar包来代替

 

9、处理Lazy

package org.mldn.lin.test;

 

import java.util.Properties;

 

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

 

import org.mldn.lin.entity.Groups;

import org.mldn.lin.entity.Person;

import org.mldn.lin.session.GroupsDAORemote;

import org.mldn.lin.session.PersonDAORemote;

 

public class Test {

 

    public static void main(String[] args) {

       // 定义查找参数,通过定义这些参数找到该公共空间

       Properties pro = new Properties();

        pro.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");

       pro.setProperty("java.naming.provider.url", "192.168.1.187:1099");

       pro.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");

       // 通过JNDI查找发布的接口

       try {

           Context ctx = new InitialContext(pro);

 

           // 开始查找接口

           GroupsDAORemote gdao=(GroupsDAORemote) ctx.lookup("GroupsDAO/remote");

           PersonDAORemote pdao=(PersonDAORemote) ctx.lookup("PersonDAO/remote");

          

           Groups groups=new Groups();

           groups.setTitle("111");

           groups.setDescription("第一组");

          

          

          

           Person person=new Person();

           person.setUid("lin");

           person.setName("mldn");

           person.setAge(25);

           Groups g=new Groups();

           g.setId(1);

           person.setGroups(g);

          

           Person person1=new Person();

           person1.setUid("wei");

           person1.setName("mldn");

           person1.setAge(25);

           person1.setGroups(g);

          

           // 打印结果

//         System.out.println(gdao.doCreate(groups));

//         System.out.println(gdao.findById(1).getTitle());

//         System.out.println(pdao.doCreate(person));

//         System.out.println(pdao.doCreate(person1));

//         System.out.println(pdao.findById("lin"));

           System.out.println(pdao.findById("lin").getGroups().getTitle());

          

           //System.out.println(gdao.findById(1).getPersons().size());

          

 

       } catch (NamingException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

 

    }

 

}

 

当进行级联查询时,不管通过一查多,还是通过多的查一,都会报lazy

严重: could not initialize proxy - no Session

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)

 

解决方案:

可以将LAZY关闭或在实现类中使用.的方式先进行查询

package org.mldn.lin.session;

 

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

 

import org.mldn.lin.entity.Groups;

 

@Stateless

public class GroupsDAO implements GroupsDAORemote {

   

    @PersistenceContext

    private EntityManager em;

   

    public boolean doCreate(Groups groups) throws Exception {

       // TODO Auto-generated method stub

       this.em.persist(groups);

       return true;

    }

 

    public Groups findById(int gid) throws Exception {

       // TODO Auto-generated method stub

       Groups groups=this.em.find(Groups.class, gid);

       groups.getPersons().size();

       return groups;

    }

 

}

 

package org.mldn.lin.session;

 

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

 

import org.mldn.lin.entity.Person;

 

@Stateless

public class PersonDAO implements PersonDAORemote {

 

    @PersistenceContext

    private EntityManager em;

    public boolean doCreate(Person person) throws Exception {

       // TODO Auto-generated method stub

       this.em.persist(person);

       return true;

    }

 

    public Person findById(String uid) throws Exception {

       // TODO Auto-generated method stub

       Person person=this.em.find(Person.class, uid);

       person.getGroups().getTitle();

       return person;

    }

   

}

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值