EJB实体bean之间的关系-ORM 博客分类: EJBJ2EE
1.ORM:
Object Relational Mapping
对象/关系映射
2.一对一关系映射 @OneToOne
2.1.一对一单向映射
单向:A到B,不需要B到A
如一个人对应一部家庭电话
而一部家庭电话并不可能只对应一个人
实际情况下:是从人定位到电话而不是从电话定位到所有人
Person_OneToOneSingle
package orm.onetoone.single; import java.io.Serializable; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.PrimaryKeyJoinColumn; @Entity public class Person_OneToOneSingle implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; private String sex; private int age; private HomePhone_OneToOneSingle homePhone; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } public String getName() { return name; } public String getSex() { return sex; } public int getAge() { return age; } @OneToOne(cascade=CascadeType.ALL,optional=true) public HomePhone_OneToOneSingle getHomePhone() { return homePhone; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setAge(int age) { this.age = age; } public void setHomePhone(HomePhone_OneToOneSingle homePhone) { this.homePhone = homePhone; } }
HomePhone_OneToOneSingle
package orm.onetoone.single; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class HomePhone_OneToOneSingle implements Serializable { private static final long serialVersionUID = 1L; private long phone; private String country,province,city,street; private int postcode; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getPhone() { return phone; } public String getCountry() { return country; } public String getProvince() { return province; } public String getCity() { return city; } public String getStreet() { return street; } public int getPostcode() { return postcode; } public void setPhone(long phone) { this.phone = phone; } public void setCountry(String country) { this.country = country; } public void setProvince(String province) { this.province = province; } public void setCity(String city) { this.city = city; } public void setStreet(String street) { this.street = street; } public void setPostcode(int postcode) { this.postcode = postcode; } }
表结构:
2.2一对一双向映射
人和身份证号:从人可以定位到身份证号,从身份证号可以定位到人是双向的一对一映射
Person_OneToOneEach
package orm.onetoone.each; import java.io.Serializable; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import orm.onetoone.single.HomePhone_OneToOneSingle; @Entity public class Person_OneToOneEach implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; private String sex; private int age; private HomePhone_OneToOneSingle homePhone; private IDCard_OneToOneEach idCard; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } public String getName() { return name; } public String getSex() { return sex; } public int getAge() { return age; } @OneToOne(cascade=CascadeType.ALL,optional=true) public HomePhone_OneToOneSingle getHomePhone() { return homePhone; } @OneToOne(cascade=CascadeType.ALL,optional=true) public IDCard_OneToOneEach getIdCard() { return idCard; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setAge(int age) { this.age = age; } public void setHomePhone(HomePhone_OneToOneSingle homePhone) { this.homePhone = homePhone; } public void setIdCard(IDCard_OneToOneEach idCard) { this.idCard = idCard; } }
IDCard_OneToOneEach
package orm.onetoone.each; import java.io.Serializable; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; @Entity public class IDCard_OneToOneEach implements Serializable{ private static final long serialVersionUID = 1L; private long id; private Person_OneToOneEach person; private String cardNumber; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } @OneToOne(cascade=CascadeType.ALL,mappedBy="idCard",optional=false) public Person_OneToOneEach getPerson() { return person; } public String getCardNumber() { return cardNumber; } public void setId(long id) { this.id = id; } public void setPerson(Person_OneToOneEach person) { this.person = person; } public void setCardNumber(String cardNumber) { this.cardNumber = cardNumber; } }
表结构:
3。 一对多 one-to-many
3.1一对多单向映射
人与电话之间的关系,一个人可以有多个电话,但是多个电话不一定属于一个人的,因为电话号码今天可能是你的,明天可能就是别人的了
Person_OneToManySingle
package orm.onetomany.single; import java.io.Serializable; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import orm.onetoone.each.IDCard_OneToOneEach; import orm.onetoone.single.HomePhone_OneToOneSingle; @Entity public class Person_OneToManySingle implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; private String sex; private int age; private HomePhone_OneToOneSingle homePhone; private IDCard_OneToOneEach idCard; private List<Phone_OneToManyEach> phones; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="personID") public List<Phone_OneToManyEach> getPhones() { return phones; } @OneToOne(cascade=CascadeType.ALL,optional=true) public HomePhone_OneToOneSingle getHomePhone() { return homePhone; } @OneToOne(cascade=CascadeType.ALL,optional=true) public IDCard_OneToOneEach getIdCard() { return idCard; } public String getName() { return name; } public String getSex() { return sex; } public int getAge() { return age; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setAge(int age) { this.age = age; } public void setHomePhone(HomePhone_OneToOneSingle homePhone) { this.homePhone = homePhone; } public void setIdCard(IDCard_OneToOneEach idCard) { this.idCard = idCard; } public void setPhones(List<Phone_OneToManyEach> phones) { this.phones = phones; } }
Phone_OneToManySingle
package orm.onetomany.single; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Phone_OneToManySingle implements Serializable { private static final long serialVersionUID = 1L; private long id; private String phoneNumber; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } public String getPhoneNumber() { return phoneNumber; } public void setId(long id) { this.id = id; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } }
表结构:
3.2一对多双向映射
人下订单,一个人可以下多个订单,每个订单都有对应的下订单的人,他们是双向映射
Person_OneToManyEach
package orm.onetomany.each; import java.io.Serializable; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import orm.onetomany.single.Phone_OneToManySingle; import orm.onetoone.each.IDCard_OneToOneEach; import orm.onetoone.single.HomePhone_OneToOneSingle; @Entity public class Person_OneToManyEach implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; private String sex; private int age; private HomePhone_OneToOneSingle homePhone; private IDCard_OneToOneEach idCard; private List<Phone_OneToManySingle> phones; private List<Order_OneToManyEach> orders; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="personID") public List<Phone_OneToManySingle> getPhones() { return phones; } @OneToOne(cascade=CascadeType.ALL,optional=true) public HomePhone_OneToOneSingle getHomePhone() { return homePhone; } @OneToOne(cascade=CascadeType.ALL,optional=true) public IDCard_OneToOneEach getIdCard() { return idCard; } @OneToMany(cascade=CascadeType.ALL,mappedBy="person") public List<Order_OneToManyEach> getOrders() { return orders; } public String getName() { return name; } public String getSex() { return sex; } public int getAge() { return age; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setAge(int age) { this.age = age; } public void setHomePhone(HomePhone_OneToOneSingle homePhone) { this.homePhone = homePhone; } public void setIdCard(IDCard_OneToOneEach idCard) { this.idCard = idCard; } public void setPhones(List<Phone_OneToManySingle> phones) { this.phones = phones; } public void setOrders(List<Order_OneToManyEach> orders) { this.orders = orders; } }
Order_OneToManyEach
package orm.onetomany.each; import java.io.Serializable; import java.util.Date; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; @Entity public class Order_OneToManyEach implements Serializable{ private static final long serialVersionUID = 1L; private long id; private Person_OneToManyEach person; private String orderNumber; private String orderName; private Date date; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } @ManyToOne(cascade=CascadeType.ALL,optional=false) @JoinColumn(name="personID") public Person_OneToManyEach getPerson() { return person; } public String getOrderNumber() { return orderNumber; } public String getOrderName() { return orderName; } public Date getDate() { return date; } public void setId(long id) { this.id = id; } public void setPerson(Person_OneToManyEach person) { this.person = person; } public void setOrderNumber(String orderNumber) { this.orderNumber = orderNumber; } public void setOrderName(String orderName) { this.orderName = orderName; } public void setDate(Date date) { this.date = date; } }
表结构
4.多对一单向关联
多的一方知道自己属于一的一方,而一的一方并不知道多的一方,如人和国家,很多人肯定属于一个国家,而国家并不知道每个人
Person_ManyToOneSingle
package orm.manytoone.single; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; @Entity public class Person_ManyToOneSingle implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; private String sex; private int age; private Country_ManyToOneSingle country; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } @ManyToOne @JoinColumn(name="countryID") public Country_ManyToOneSingle getCountry() { return country; } public String getName() { return name; } public String getSex() { return sex; } public int getAge() { return age; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setAge(int age) { this.age = age; } public void setCountry(Country_ManyToOneSingle country) { this.country = country; } }
Country_ManyToOneSingle
package orm.manytoone.single; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Country_ManyToOneSingle implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; private String area; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } public String getName() { return name; } public String getArea() { return area; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setArea(String area) { this.area = area; } }
表结构:
5.多对多many-to-many
5.1多对多单向映射
学生和老师的关系,就是多对多关系,我们可以强制让学生知道老师的信息,而老师不用记住所有所教的学生的信息,这就可以用多对多单向关系
Student_ManyToManySingle
package orm.manytomany.single; import java.io.Serializable; import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; @Entity public class Student_ManyToManySingle implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; private String sex; private List<Teacher_ManyToManySingle> teachers; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } public String getName() { return name; } public String getSex() { return sex; } @ManyToMany public List<Teacher_ManyToManySingle> getTeachers() { return teachers; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setTeachers(List<Teacher_ManyToManySingle> teachers) { this.teachers = teachers; } }
Teacher_ManyToManySingle
package orm.manytomany.single; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Teacher_ManyToManySingle implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } public String getName() { return name; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } }
表结构
5.2多对多双向映射
如果上面的例子让老师也知道他所有学生的信息就可以用多对多双向映射关系来表示
Student_ManyToManyEach
package orm.manytomany.each; import java.io.Serializable; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; @Entity public class Student_ManyToManyEach implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; private String sex; private List<Teacher_ManyToManyEach> teachers; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } public String getName() { return name; } public String getSex() { return sex; } @ManyToMany(cascade=CascadeType.ALL) @JoinTable( name="StudentsAndTeachers", joinColumns={@JoinColumn(name="studentID")}, inverseJoinColumns={@JoinColumn(name="teacherID")} ) public List<Teacher_ManyToManyEach> getTeachers() { return teachers; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setTeachers(List<Teacher_ManyToManyEach> teachers) { this.teachers = teachers; } }
Teacher_ManyToManyEach
package orm.manytomany.each; import java.io.Serializable; import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; @Entity public class Teacher_ManyToManyEach implements Serializable { private static final long serialVersionUID = 1L; private long id; private String name; private List<Student_ManyToManyEach> students; @Id @GeneratedValue(strategy=GenerationType.AUTO) public long getId() { return id; } @ManyToMany(mappedBy="teachers") public List<Student_ManyToManyEach> getStudents() { return students; } public String getName() { return name; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setStudents(List<Student_ManyToManyEach> students) { this.students = students; } }
表结构: