六、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; }
}
|