EJB3.0实例教程多对多映射
来源:互联网 发布:linux编译内核步骤 编辑:程序博客网 时间:2024/06/12 23:51
7浪曦视频在线J2ee系列讲座
EJB实体Bean的开发
多对多映射
学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个学生。多对多映射采取中间表连接的映射 策略,建立的中间表将分别引入两边的主键作为外键。EJB3 对于中间表的元数据提供了可配置的方式,用户可 以自定义中间表的表名,列名。
下面就以学生和老师为例介绍多对多关系的实体 Bean 开发
需要映射的数据库表结构
student
字段名称 字段类型属性 描述
studentid (主键) Int(11) not null 学生 ID
studentName varchar(32) not null 学生姓名
teacher
字段名称 字段类型属性 描述
teacherid (主键) Int(11) not null 教师 ID
teacherName varchar(32) not nul 教师姓名
中间表 teacher_student
字段名称 字段类型属性 描述
Student_ID Int(11) not null 是student 表 studentid 列的外键
Teacher_ID Int(11) not null 是 teacher 表 teacherid 列的外键
标准的sql语句
create table student(studentid int not null primary key auto_increment,
studentName varchar(32) not null);
create table teacher(teacherid int not null primary key auto_increment,
teacherName varchar(32) not null);
create table teacher_student(Student_ID int not null,
Teacher_ID int not null
);
ALTER TABLE teacher_student
ADD CONSTRAINT `tid` FOREIGN KEY (`Teacher_ID`) REFERENCES `teacher` (`teacherid`) ,
ADD CONSTRAINT `sid` FOREIGN KEY (`Student_ID`) REFERENCES `student` (`studentid`) ;
Student.java
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@SuppressWarnings("serial")
@Entity
@Table(name = "Student")
public class Student implements Serializable {
private Integer studentid;
private String StudentName;
private Set<Teacher> teachers = new HashSet<Teacher>();
public Student() {
}
public Student(String studentName) {
StudentName = studentName;
}
@Id
@GeneratedValue
public Integer getStudentid() {
return studentid;
}
public void setStudentid(Integer studentid) {
this.studentid = studentid;
}
@Column(nullable = false, length = 32)
public String getStudentName() {
return StudentName;
}
public void setStudentName(String studentName) {
StudentName = studentName;
}
@ManyToMany(mappedBy = "students")
/**
*学生类作为多对多的一方,对应教师的SET集合,
*mappedBy 属性定义了包含Students属性的一方为双向关系的维护端
*指定教师作为关系的维护端--DAO业务接口
**/
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
@ManyToMany 注释表示 Student 是多对多关系的一边,mappedBy 属性定义了包含Students属性的一方为双向关系的维护端
(owning side)。
Teacher.java
import java.io.Serializable;
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.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@SuppressWarnings("serial")
@Entity
@Table(name = "Teacher")
public class Teacher implements Serializable {
private Integer teacherid;
private String TeacherName;
private Set<Student> students = new HashSet<Student>();
public Teacher() {
}
public Teacher(String teacherName) {
TeacherName = teacherName;
}
@Id
@GeneratedValue
public Integer getTeacherid() {
return teacherid;
}
public void setTeacherid(Integer teacherid) {
this.teacherid = teacherid;
}
@Column(nullable = false, length = 32)
public String getTeacherName() {
return TeacherName;
}
public void setTeacherName(String teacherName) {
TeacherName = teacherName;
}
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "Teacher_Student", joinColumns = { @JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid") }, inverseJoinColumns = { @JoinColumn(name = "Student_ID", referencedColumnName = "studentid") })
public Set<Student> getStudents() {
return students;
}
//定义方法用于添加,删除学生--确定教师作为关系维护端
public void setStudents(Set<Student> students) {
this.students = students;
}
public void addStudent(Student student) {
if (!this.students.contains(student)) {
this.students.add(student);
}
}
public void removeStudent(Student student) {
this.students.remove(student);
}
@ManyToMany 注释表示 Teacher 是多对多关系的一端。@JoinTable 描述了多对多关系的数据表关系。name 属 性指定中间表名称,joinColumns 定义中间表与 Teacher 表的外键关系。上面的代码中,中间表 Teacher_Student
的 Teacher_ID 列是 Teacher 表的主键列对应的外键列,inverseJoinColumns 属性定义了中间表与另外一端(Student)
的外键关系。
为了使用上面的实体 Bean,我们定义一个 Session Bean 作为他的使用者。下面是 Session Bean 的业务接口,他定
义了三个业务方法 insertTeacher,getTeacherByID,和 getStudentByID, 三个方法的业务功能是:
insertTeacher 添加一个教师(带学生)进数据库 getTeacherByID 获取指定编号的教师 getStudentByID 获取指定编号的学生
下面是 Session Bean 的业务接口及实现类
TeacherDAO.java
import javax.ejb.Remote;
import com.mjpc.entity.Student;
import com.mjpc.entity.Teacher;
@Remote
public interface TeacherDAO {
public void insertTeacher(String name, String[] studentnames);
public Teacher getTeacherByID(Integer teacherid);
public Student getStudentByID(Integer studentid);
}
TeacherDAOBean.java
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.mjpc.entity.Student;
import com.mjpc.entity.Teacher;
public @Stateless
class TeacherDAOBean implements TeacherDAO {
@PersistenceContext
protected EntityManager em;
public void insertTeacher(String name, String[] studentnames) {
Teacher teacher = new Teacher(name);
if (studentnames != null) {
for (int i = 0; i < studentnames.length; i++) {
teacher.addStudent(new Student(studentnames[i]));
}
}
em.persist(teacher);
}
public Teacher getTeacherByID(Integer teacherid) {
Teacher teacher = em.find(Teacher.class, teacherid);
if (teacher != null)
teacher.getStudents().size();
return teacher;
}
public Student getStudentByID(Integer studentid) {
Student student = em.find(Student.class, studentid);
if (student != null)
student.getTeachers().size();
return student;
}
}
测试代码Test,java
import java.util.Iterator;
import java.util.Properties;
import javax.naming.InitialContext;
import com.mjpc.entity.Student;
import com.mjpc.entity.Teacher;
import com.mjpc.session.TeacherDAO;
public class Test {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx = new InitialContext(props);
try {
TeacherDAO teacherdao = (TeacherDAO) ctx
.lookup("TeacherDAOBean/remote");
teacherdao
.insertTeacher("李老师", new String[] { "张小红", "朱小光", "龚利" });
Teacher teacher = teacherdao.getTeacherByID(new Integer(1));
if (teacher != null) {
System.out.println("======= 获取编号为1的老师姓名:"
+ teacher.getTeacherName() + "======<br>");
Iterator iterator = teacher.getStudents().iterator();
while (iterator.hasNext()) {
Student student = (Student) iterator.next();
System.out.println("他的学生:" + student.getStudentName()
);
}
} else {
System.out.println("没有找到编号为1的老师");
}
Student student = teacherdao.getStudentByID(new Integer(1));
if (student != null) {
System.out.println("======= 获取编号为1的学生姓名:"
+ student.getStudentName() + "======");
Iterator iterator = student.getTeachers().iterator();
while (iterator.hasNext()) {
Teacher tc = (Teacher) iterator.next();
System.out.println("他的老师:" + tc.getTeacherName() );
}
} else {
System.out.println("没有找到编号为1的学生");
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
下面是 Session Bean 的 JSP 客户端代码:
ManyToManyTest.jsp
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="com.foshanshop.ejb3.TeacherDAO, com.foshanshop.ejb3.bean.*, javax.naming.*,
java.util.*"%>
<%
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory"); props.setProperty("java.naming.provider.url", "localhost:1099"); props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx = new InitialContext(props);
try {
TeacherDAO teacherdao = (TeacherDAO) ctx.lookup("TeacherDAOBean/remote");
teacherdao.insertTeacher("李老师",new String[]{"张小红","朱小光","龚利"}); Teacher teacher = teacherdao.getTeacherByID(new Integer(1));
if (teacher!=null){
out.println("======= 获取编号为1的老师姓名:"+ teacher.getTeacherName() +"
======<br>");
Iterator iterator = teacher.getStudents().iterator();
while (iterator.hasNext()){
Student student = (Student) iterator.next();
out.println(" 他的学生:"+ student.getStudentName() +"<br>");
}
}else{
out.println("没有找到编号为1的老师<br>");
}
Student student = teacherdao.getStudentByID(new Integer(1));
if (student!=null){
out.println("======= 获取编号为1的学生姓名:"+ student.getStudentName() +"
======<br>");
Iterator iterator = student.getTeachers().iterator();
while (iterator.hasNext()){
Teacher tc = (Teacher) iterator.next();
out.println(" 他的老师:"+ tc.getTeacherName() +"<br>");
}
}else{
out.println("没有找到编号为1的学生<br>");
}
} catch (Exception e) {
out.println(e.getMessage());
}
%>
- EJB3.0实例教程多对多映射
- EJB3.0实例教程
- Jboss EJB3.0 实例教程
- Jboss EJB3.0实例教程
- Jboss EJB3.0实例教程
- EJB3中多对多映射实例讲解
- EJB3 一对多及多对一映射
- EJB3.0开发指南:多表映射
- EJB3.0实例教程如何调用存储过程
- EJB3.0开发指南:多对多和一对一
- ejb3 One对One关系映射
- eclipse + JBoss 5 + EJB3开发指南(9):实现Entity Bean的多对多(many-to-many)映射
- EJB3中的多对多关系
- Java Web2.0项目开发进阶---Hibernate 对标注的支持,用EJB3注解进行映射
- EJB3.0一对多关系
- 多对多映射
- 多对多映射
- 多对多映射
- MySQL Proxy 安装与读写分离体验
- 2009中国最具潜力IC设计公司
- sysctl.conf优化方案
- Struts1.x系列教程(7):Logic标签库
- VB SendKeys用法(模拟按键)
- EJB3.0实例教程多对多映射
- ASP.NET生成静态页面
- ATL学习之MSDN实例制作!
- squid 限速
- System.setOut 恢复
- 1-3章
- 为了父母,为了自己,为了承诺!
- silktest简介
- 网址记录