JPA 双向多对多关联(@ManyToMany)
下面仍旧使用客户实体(CustomerEO)与地址实体(AddressEO)为例来说明如何映射多对多关系的映射。
一个客户可以有多个地址,一个地址又可以所属多个的客户。客户和地址是对对多的关系,并且地址与客户是双向关联的。实例如下:
package com.demo.bean.manytomany;import java.util.ArrayList;import java.util.Collection;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.Table;import javax.persistence.Version;/** * * manytomany双向,外键关联, * @author ALEX * */@Entity@Table(name = "t_customer_mm")public class Customer_mm {@Versionprivate Long version;@Id@GeneratedValueprivate Long id;//客户ID@Columnpublic String name;//客户名称@ManyToMany(cascade={CascadeType.ALL})@JoinTable(name="ref_customer_address",joinColumns={@JoinColumn(name="customer_id",referencedColumnName="id")},inverseJoinColumns={ @JoinColumn(name="address_id",referencedColumnName="id")})public Collection<Address_mm> address = new ArrayList<Address_mm>();public Customer_mm(){}//-----------------可省get,set--------------}package com.demo.bean.manytomany;import java.util.ArrayList;import java.util.Collection;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToMany;import javax.persistence.Table;import javax.persistence.Version;/** * entity Address_mm * @author ALEX * */@Entity@Table(name="t_address_mm")public class Address_mm {@Versionprivate Long version;@Id@GeneratedValueprivate Long id;//idpublic String province;//省份public String city;//城市public String postcode;//邮编public String detail;//详细地址 /** *说明,若为单向关联,则只需要将此注解行删除即可. */@ManyToMany(mappedBy="address")public Collection<Customer_mm> customer = new ArrayList<Customer_mm>();//----------get,set可省------------}package com.demo.bean.manytomany;import java.util.Collection;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.EntityTransaction;import javax.persistence.Persistence;public class TestJPA {/** * 测试jpa注解, * @param args */public static void main(String[] args) {// TODO Auto-generated method stubEntityManagerFactory emf = Persistence.createEntityManagerFactory("tpdb");EntityManager em = emf.createEntityManager();EntityTransaction et = em.getTransaction();et.begin(); saveOneToOne(em); et.commit(); //查询 Customer_mm ctm = em.find( Customer_mm.class, new Long(1)); Collection cot = ctm.getAddress(); for( Object address_m:cot){ Address_mm am = (Address_mm) address_m; System.out.println("cm---am --"+am.getDetail()); } }private static void saveOneToOne(EntityManager em){Customer_mm ct = new Customer_mm();ct.setName("周董");Customer_mm ct1 = new Customer_mm();ct1.setName("方文山");Address_mm ad = new Address_mm();ad.setProvince("湖北省");ad.setCity("武汉市");ad.setPostcode("201561");ad.setDetail("中心区");Address_mm ad1 = new Address_mm();ad1.setProvince("西安省");ad1.setCity("渭南市");ad1.setPostcode("250012");ad1.setDetail("大桥区");//关联ct.getAddress().add( ad );ct1.getAddress().add( ad );ct1.getAddress().add( ad1 );ad.getCustomer().add( ct );ad1.getCustomer().add( ct1 ); em.persist( ct ); em.persist( ct1 );}}