在实体属性一级使用@ManyToOne注解来定义多对一关联:
@Entity()
public class Flight implements Serializable {
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinColumn(name="COMP_ID")
public Company getCompany() {
return company;
}
...
}
其中@JoinColumn是可选的,关联字段默认值和一对一 (one to one)关联的情况相似, 列名为:主体的关联属性名+下划线+被关联端的主键列名. 在这个例子中是company_id, 因为关联的属性是company, Company的主键是id.
@ManyToOne注解有一个名为targetEntity的参数, 该参数定义了目标实体名.通常不需要定义该参数, 因为在大部分情况下默认值(表示关联关系的属性类型)就可以很好的满足要求了. 不过下面这种情况下这个参数就显得有意义了:使用接口作为返回值而不是常见的实体.
@Entity()
public class Flight implements Serializable {
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity=CompanyImpl.class )
@JoinColumn(name="COMP_ID")
public Company getCompany() {
return company;
}
...
}
public interface Company {
...
对于多对一也可以通过关联表的方式来映射。 通过@JoinTable注解可定义关联表, 该关联表包含了指回实体表的外键(通过@JoinTable.joinColumns) 以及指向目标实体表的外键(通过@JoinTable.inverseJoinColumns).
@Entity()
public class Flight implements Serializable {
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinTable(name="Flight_Company",
joinColumns = @JoinColumn(name="FLIGHT_ID"),
inverseJoinColumns = @JoinColumn(name="COMP_ID")
)
public Company getCompany() {
return company;
}
...
}
以上摘自官方文档。
我们还是用人和地址来描述多对一的关系
package com.unicom.manytoone; import java.io.Serializable; 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.ManyToOne; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; /* * @author huzhen */ @Entity @Table(name="t_address") public class Address implements Serializable { /** * */ private static final long serialVersionUID = 1L; public String id; public String name; public String destict; public People people; @Id @GeneratedValue(generator="indent") @GenericGenerator(name="indent",strategy="uuid") public String getId() { return id; } public void setId(String id) { this.id = id; } @Column(length=32) public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(length=32) public String getDestict() { return destict; } public void setDestict(String destict) { this.destict = destict; } @ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY) public People getPeople() { return people; } public void setPeople(People people) { this.people = people; } } package com.unicom.manytoone; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; /* * @author huzhen */ @Entity @Table(name="t_people") public class People implements Serializable { public String id; public int age; public String des; @Id @GeneratedValue(generator="indent") @GenericGenerator(name="indent",strategy="uuid") public String getId() { return id; } public void setId(String id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Column(length=32) public String getDes() { return des; } public void setDes(String des) { this.des = des; } } package com.unicom.manytoone; import java.util.ArrayList; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; import org.junit.After; import org.junit.Before; /* * @author huzhen */ public class Test { public static SessionFactory sessionFactory; public static Session session; @Before public void opensession(){ Configuration config = new AnnotationConfiguration(); config.configure(); sessionFactory = config.buildSessionFactory(); session = sessionFactory.getCurrentSession(); session.beginTransaction(); } @After public void closesession() { session.getTransaction().commit(); sessionFactory.close(); } /* * 测试前,感觉这样插入会不正确,后来测试一下竟然成功,感觉hibernate底层处理强大 */ @org.junit.Test public void inserttest(){ People ple=new People(); ple.setAge(17); ple.setDes("hehehheheheh"); Address add=new Address(); add.setName("公司"); add.setDestict("dizhi"); add.setPeople(ple); Address add1=new Address(); add1.setName("hoime"); add1.setDestict("dizhi"); add1.setPeople(ple); Address add2=new Address(); add2.setName("home"); add2.setDestict("dizhi"); add2.setPeople(ple); session.save(add); session.save(add1); session.save(add2); } @org.junit.Test public void select() { //session.get(People.class, "8ab8dab2493fd57401493fd577100002"); //只是select people Address add=(Address) session.get(Address.class, "8ab8dab2493fd57401493fd577100001"); //配置延迟加载后,只加载address,否则全部加载 System.out.println("<<<<<<<<<<<<<<<<<<<"); System.out.println(add.getPeople().getId()); //测试延迟加载确实有用 } @org.junit.Test public void delete(){ // Address add=(Address) session.get(Address.class, "8ab8dab2493fd57401493fd577100001"); //配置延迟加载后,只加载address,否则全部加载 // session.delete(add); //两次查询,两次删除,(此方法失败,报错无法执行批量更新,caused by 外键关联) List
query=new ArrayList(); try { //query= session.createQuery("select u from Address u").list(); query = session.createQuery("from "+Address.class.getName()).list(); //query=session.createSQLQuery("select * from t_address").list(); } catch (Exception e) { e.printStackTrace(); } // Criteria crit=session.createCriteria(Address.class); // query=crit.list(); for(Address add:query){ session.delete(add); } } }