• jpa双向一对一关联外键映射


    项目结构:

    Wife

    
    package auth.model;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="wife")
    public class Wife {
    	private int id;
    	private String name;
    	private int age;
    	private Husband husband;
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	@Column(name="id")
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	@Column(name="name")
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	@Column(name="age")
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	//mappedBy="wife"表示Husband中wife属性已经做映射,如果不写mappedBy="wife"会在wife表中生成一个husband_id外键,这是多余的。
    	//mappedBy指向被维护端wife,由husband维护
    	@OneToOne(mappedBy="wife",cascade=CascadeType.ALL,fetch=FetchType.LAZY,targetEntity=Husband.class)
    	public Husband getHusband() {
    		return husband;
    	}
    	public void setHusband(Husband husband) {
    		this.husband = husband;
    	}
    }
    
    

    Husband

    
    package auth.model;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="husband")
    public class Husband {
    	private int id;
    	private String name;
    	private int age;
    	private Wife wife;
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	@Column(name="id")
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	@Column(name="name")
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	@Column(name="age")
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	//注意:这个husband的id要和wife的id一样,表的主键同时是另一张表的外键,不然无法关联
    	@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY,targetEntity=Wife.class)
    	@JoinColumn(name="id", unique=true, nullable=false, updatable=false)
    	public Wife getWife() {
    		return wife;
    	}
    	public void setWife(Wife wife) {
    		this.wife = wife;
    	}
    }
    
    

    DAO:

    
    package auth.dao;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import auth.model.Husband;
    
    public interface HusbandRepository extends JpaRepository<Husband, Integer>{
    }
    
    package auth.dao;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import auth.model.Wife;
    
    public interface WifeRepository extends JpaRepository<Wife, Integer>{
    
    }
    
    

    UserController

    
    package auth.controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.alibaba.fastjson.JSONObject;
    
    import auth.dao.HusbandRepository;
    import auth.dao.WifeRepository;
    import auth.model.Husband;
    import auth.model.Wife;
    @Service
    public class UserController {
    	private Logger log=LoggerFactory.getLogger(this.getClass());
    	@Autowired
    	private HusbandRepository husDao;
    	@Autowired
    	private WifeRepository wifeDao;
    	public void addUser(){
    		Husband hus=new Husband();
    		hus.setAge(23);
    		hus.setName("wy2");
    		Wife wife=new Wife();
    		wife.setName("xxt2");
    		wife.setAge(22);
    		wife.setHusband(hus);
    		wifeDao.save(wife);
    	}
    	public void deleteUser(){
    		wifeDao.delete(7);
    	}
    	public void updateUser(){
    		Wife wife=wifeDao.findOne(8);
    		wife.setName("wf");
    		wife.getHusband().setName("updatehus");
    		wifeDao.save(wife);
    	}
    	public String queryUser(){
    		Wife wife=wifeDao.findOne(8);
    		return JSONObject.toJSONString(wife);
    	}
    }
    
    

    Tests

    
    package spring;
    
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import auth.controller.UserController;
    
    public class Tests extends Base{
    	@Autowired
    	private UserController con;
    	@Test
    	public void addUser(){
    		con.addUser();
    	}
    	@Test
    	public void deleteUser(){
    		con.deleteUser();
    	}
    	@Test
    	public void updateUser(){
    		con.updateUser();
    	}
    	@Test
    	public void queryUser(){
    		String result=con.queryUser();
    		System.out.println(result);
    	}
    
    }
    
    

    运行过程:

    add

    insert 
        into
            wife
            (age, name) 
        values
            (?, ?)
    2017-05-26 09:01:21,653 DEBUG [org.hibernate.id.IdentifierGeneratorHelper:94] - Natively generated identity: 9
    2017-05-26 09:01:21,664 DEBUG [org.hibernate.engine.spi.ActionQueue:196] - Executing identity-insert immediately
    2017-05-26 09:01:21,665 DEBUG [org.hibernate.SQL:109] - 
        insert 
        into
            husband
            (age, name) 
        values
            (?, ?)

    delete

    delete 
        from
            husband 
        where
            id=?
    2017-05-26 08:58:00,180 DEBUG [org.hibernate.SQL:109] - 
        delete 
        from
            wife 
        where
            id=?

    update

    update
            husband 
        set
            age=?,
            name=? 
        where
            id=?
    2017-05-26 09:10:33,317 DEBUG [org.hibernate.SQL:109] - 
        update
            wife 
        set
            age=?,
            name=? 
        where
            id=?

    query

    select
            wife0_.id as id1_1_0_,
            wife0_.age as age2_1_0_,
            wife0_.name as name3_1_0_ 
        from
            wife wife0_ 
        where
            wife0_.id=?
    2017-05-26 09:00:05,215 DEBUG [org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl:127] - Starting ResultSet row #0
    2017-05-26 09:00:05,219 DEBUG [org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl:142] - On call to EntityIdentifierReaderImpl#resolve, EntityKey was already known; should only happen on root returns with an optional identifier specified
    2017-05-26 09:00:05,241 DEBUG [org.hibernate.engine.internal.TwoPhaseLoad:160] - Resolving associations for [auth.model.Wife#8]
    2017-05-26 09:00:05,243 DEBUG [org.hibernate.SQL:109] - 
        select
            husband0_.id as id1_0_0_,
            husband0_.age as age2_0_0_,
            husband0_.name as name3_0_0_ 
        from
            husband husband0_ 
        where
            husband0_.id=?
  • 相关阅读:
    [转] Web前端优化之 Flash篇
    [转] Web 前端优化最佳实践之 Mobile(iPhone) 篇
    [转] Web前端优化之 图片篇
    [转] Web前端优化之 Javascript篇
    [转] Web前端优化之 CSS篇
    react事件获取元素
    Nodejs学习笔记02【module】
    Nodejs学习笔记01【EventEmitter】
    javascript运算符优先级
    jQuery-placeholder
  • 原文地址:https://www.cnblogs.com/JAYIT/p/6903924.html
Copyright © 2020-2023  润新知