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=?

转载于:https://www.cnblogs.com/JAYIT/p/6903924.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值