hibernate注解之多对一注解(五)

在实体属性一级使用@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); } } }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值