项目结构:

Wife


  1. package auth.model;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8. @Entity
  9. @Table(name="wife")
  10. public class Wife {
  11. private int id;
  12. private String name;
  13. private int age;
  14. @Id
  15. @GeneratedValue(strategy=GenerationType.AUTO)
  16. @Column(name="id")
  17. public int getId() {
  18. return id;
  19. }
  20. public void setId(int id) {
  21. this.id = id;
  22. }
  23. @Column(name="name")
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. @Column(name="age")
  31. public int getAge() {
  32. return age;
  33. }
  34. public void setAge(int age) {
  35. this.age = age;
  36. }
  37. }

Husband


  1. package auth.model;
  2. import javax.persistence.CascadeType;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.FetchType;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.GenerationType;
  8. import javax.persistence.Id;
  9. import javax.persistence.JoinColumn;
  10. import javax.persistence.OneToOne;
  11. import javax.persistence.Table;
  12. @Entity
  13. @Table(name="husband")
  14. public class Husband {
  15. private int id;
  16. private String name;
  17. private int age;
  18. private Wife wife;
  19. @Id
  20. @GeneratedValue(strategy=GenerationType.AUTO)
  21. @Column(name="id")
  22. public int getId() {
  23. return id;
  24. }
  25. public void setId(int id) {
  26. this.id = id;
  27. }
  28. @Column(name="name")
  29. public String getName() {
  30. return name;
  31. }
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35. @Column(name="age")
  36. public int getAge() {
  37. return age;
  38. }
  39. public void setAge(int age) {
  40. this.age = age;
  41. }
  42. //注意:这个husband的id要和wife的id一样,表的主键同时是另一张表的外键,不然无法关联
  43. @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY,targetEntity=Wife.class)
  44. @JoinColumn(name="id", unique=true, nullable=false, updatable=false)
  45. public Wife getWife() {
  46. return wife;
  47. }
  48. public void setWife(Wife wife) {
  49. this.wife = wife;
  50. }
  51. }

DAO:


  1. package auth.dao;
  2. import org.springframework.data.jpa.repository.JpaRepository;
  3. import auth.model.Husband;
  4. public interface HusbandRepository extends JpaRepository<Husband, Integer>{
  5. }
  6. package auth.dao;
  7. import org.springframework.data.jpa.repository.JpaRepository;
  8. import auth.model.Wife;
  9. public interface WifeRepository extends JpaRepository<Wife, Integer>{
  10. }

UserController


  1. package auth.controller;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import com.alibaba.fastjson.JSONObject;
  7. import auth.dao.HusbandRepository;
  8. import auth.dao.WifeRepository;
  9. import auth.model.Husband;
  10. import auth.model.Wife;
  11. @Service
  12. public class UserController {
  13. private Logger log=LoggerFactory.getLogger(this.getClass());
  14. @Autowired
  15. private HusbandRepository husDao;
  16. @Autowired
  17. private WifeRepository wifeDao;
  18. public void addUser(){
  19. Husband hus=new Husband();
  20. hus.setAge(23);
  21. hus.setName("wy");
  22. Wife wife=new Wife();
  23. wife.setName("xxt");
  24. wife.setAge(22);
  25. hus.setWife(wife);
  26. husDao.save(hus);
  27. }
  28. public void deleteUser(){
  29. husDao.delete(6);
  30. }
  31. public void updateUser(){
  32. Husband hus=husDao.findOne(7);
  33. hus.setName("ws");
  34. hus.getWife().setName("updatelcy");
  35. husDao.save(hus);
  36. }
  37. public String queryUser(){
  38. Husband husband=husDao.findOne(8);
  39. return JSONObject.toJSONString(husband);
  40. }
  41. }

Tests


  1. package spring;
  2. import org.junit.Test;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import auth.controller.UserController;
  5. public class Tests extends Base{
  6. @Autowired
  7. private UserController con;
  8. @Test
  9. public void addUser(){
  10. con.addUser();
  11. }
  12. @Test
  13. public void deleteUser(){
  14. con.deleteUser();
  15. }
  16. @Test
  17. public void updateUser(){
  18. con.updateUser();
  19. }
  20. @Test
  21. public void queryUser(){
  22. String result=con.queryUser();
  23. System.out.println(result);
  24. }
  25. }

运行过程:

add

  1. 2017-05-25 12:59:21,930 DEBUG [org.hibernate.SQL:109] -
  2. insert
  3. into
  4. husband
  5. (age, name)
  6. values
  7. (?, ?)
  8. 2017-05-25 12:59:21,981 DEBUG [org.hibernate.id.IdentifierGeneratorHelper:94] - Natively generated identity: 6
  9. 2017-05-25 12:59:21,990 DEBUG [org.hibernate.engine.spi.ActionQueue:196] - Executing identity-insert immediately
  10. 2017-05-25 12:59:21,991 DEBUG [org.hibernate.SQL:109] -
  11. insert
  12. into
  13. wife
  14. (age, name)
  15. values
  16. (?, ?)
  17.  
  18. delete
  1. delete
  2. from
  3. wife
  4. where
  5. id=?
  6. 2017-05-25 14:55:37,618 DEBUG [org.hibernate.SQL:109] -
  7. delete
  8. from
  9. husband
  10. where
  11. id=?
  12.  
  13. update
  1. update
  2. wife
  3. set
  4. age=?,
  5. name=?
  6. where
  7. id=?
  8. 2017-05-25 14:46:32,037 DEBUG [org.hibernate.SQL:109] -
  9. update
  10. husband
  11. set
  12. age=?,
  13. name=?
  14. where
  15. id=?
  16.  
  17. query
  1. select
  2. husband0_.id as id1_0_0_,
  3. husband0_.age as age2_0_0_,
  4. husband0_.name as name3_0_0_
  5. from
  6. husband husband0_
  7. where
  8. husband0_.id=?
  9. 2017-05-25 14:48:24,685 DEBUG [org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl:127] - Starting ResultSet row #0
  10. 2017-05-25 14:48:24,687 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
  11. 2017-05-25 14:48:24,705 DEBUG [org.hibernate.engine.internal.TwoPhaseLoad:160] - Resolving associations for [auth.model.Husband#8]
  12. 2017-05-25 14:48:24,708 DEBUG [org.hibernate.SQL:109] -
  13. select
  14. wife0_.id as id1_1_0_,
  15. wife0_.age as age2_1_0_,
  16. wife0_.name as name3_1_0_
  17. from
  18. wife wife0_
  19. where
  20. wife0_.id=?

查询运行结果:

  1. {"age":23,"id":8,"name":"wy","wife":{"age":22,"id":8,"name":"xxt"}}

jpa单向一对一关系外键映射的更多相关文章

  1. jpa双向一对一关联外键映射

    项目结构: Wife package auth.model; import javax.persistence.CascadeType; import javax.persistence.Column ...

  2. Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

                                                        Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...

  3. Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

      注:本文针对的是 Entity Framework Code First 场景. 之前写过三篇文章试图理清Entity Framework中的一对一关系(单相思(单向一对一), 两情相悦(双向一对 ...

  4. Entity Framework - 基于外键关联的单向一对一关系

    代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关 ...

  5. 011一对一 唯一外键关联映射_单向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  6. JPA 系列教程9-双向一对一唯一外键

    双向一对一唯一外键的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(25 ...

  7. 012一对一 唯一外键关联映射_双向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  8. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

  9. Hibernate一对一外键映射

    Hibernate 一对一外键映射                    ------------------------------                            ----- ...

随机推荐

  1. fscanf和feof的组合使用

    http://stackoverflow.com/questions/15719360/using-fscanf-using-feof 靶子代码: #include<stdio.h> vo ...

  2. linux系统常用命令 -设置文件夹读写权限

    设置文件夹的读写权限: sudo chmod -R 777 /data 权限码描述 sudo chmod 600 ××× (只有所有者有读和写的权限)sudo chmod 644 ××× (所有者有读 ...

  3. C++程序设计项目开发——银行自己主动提款机(二)

    函数的有关知识在后面章节会讲到,先提前了解下.在没有系统的学习完之前,咱们先来模仿着写一个样例,尝试这样的有效的学习方法.   尝试下这种学习方法. 显示功能选项 1.查询 2.取款 3.存款 4.转 ...

  4. 点滴积累【C#】---C#实现上传word以流形式保存到数据库和读取数据库中的word文件。

    本文修改来源:http://www.cnblogs.com/zmgdpg/archive/2005/03/31/129758.html 效果: 数据库: 思路: 首先保存word到数据库:获取上传文件 ...

  5. Atitit JAVA p2p设计与总结  JXTA 2

    Atitit JAVA p2p设计与总结  JXTA 2 JXTA 2 是开放源代码 P2P 网络的第二个主要版本,它利用流行的.基于 Java 的参考实现作为构建基础.在设计方面进行了重要的修改,以 ...

  6. Swift中UIView类方法(animateWithDuration)的使用

    需求:利用Swift语言实现OC语言中UIView类方法 [UIView animateWithDuration:0.5 animations:^{ bgView.alpha= 1; }]; 在Swi ...

  7. poj 3617 Best Cow Line (字符串反转贪心算法)

    Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9284   Accepted: 2826 Des ...

  8. opencv读取图像输入到tensorflow模型中进行运算【cpp】

    void TransformMatToTensor(const cv::Mat &image, Tensor &input_tensor, int input_width, int i ...

  9. 15.3.14 DP练习2

    拦截导弹 题目 某国为了防御敌国的导弹突击,发展出一种导弹拦截系统. 可是这样的导弹拦截系统有一个缺陷:尽管它的第一发炮弹可以到达随意的高度.可是以后每一发炮弹都不能高于前一发的高度. 某天,雷达捕捉 ...

  10. 初识layer遮罩层

    背景:楼主做了一个先删除数据再插入的功能,但是狂点菜单的时候会有重复数据插入进来,设置字段unique之后,再狂点,控制台也会报错. 为了防止这种问题出现,我采取了制止”狂点“这种行为出现的做法,所以 ...