问题:JPA JoinColumn vs mappedBy

两者的区别是什么呢

@Entity
public class Company {@OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)@JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")private List<Branch> branches;...
}
@Entity
public class Company {@OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, mappedBy = "companyIdRef")private List<Branch> branches;...
}

回答一

mappedBy注解按道理应该用于双向关系中的父类(company类)里面的。在这种情况下,它应该用在Company类指向它子类(Branch类)的成员变量’company’

JoinColumn注解通常被用于说明映射列(用于连接一个实体关系的),这个注解可以用在任何类里面(父类和子类),但是按道理来说只能用在一类(要么是父类要么是子类),这里的例子中,我是用在了双向关系里的子类那里,去显示出子类(Branch类)里面的一个外键

下面是一个例子:
父类,Company

@Entity
public class Company {private int companyId;private String companyName;private List<Branch> branches;@Id@GeneratedValue@Column(name="COMPANY_ID")public int getCompanyId() {return companyId;}public void setCompanyId(int companyId) {this.companyId = companyId;}@Column(name="COMPANY_NAME")public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="company")public List<Branch> getBranches() {return branches;}public void setBranches(List<Branch> branches) {this.branches = branches;}}

子类,Branch

@Entity
public class Branch {private int branchId;private String branchName;private Company company;@Id@GeneratedValue@Column(name="BRANCH_ID")public int getBranchId() {return branchId;}public void setBranchId(int branchId) {this.branchId = branchId;}@Column(name="BRANCH_NAME")public String getBranchName() {return branchName;}public void setBranchName(String branchName) {this.branchName = branchName;}@ManyToOne(fetch=FetchType.LAZY)@JoinColumn(name="COMPANY_ID")public Company getCompany() {return company;}public void setCompany(Company company) {this.company = company;}}

回答二

@JoinColumn指明了这个实体是关系的拥有者(对应着一个拥有外键的表和它的参照表)。但是mappedBy属性指明的是在这一边的实体是一个逆向的关系,而拥有者是在另一个实体里面的。这也意味着你可以在这个类里面使用到你标注了mappedBy其他表(完全双向关系)

另外,对于问题中的代码来说,正确的注解应该是下面这样的:

@Entity
public class Company {@OneToMany(mappedBy = "company",orphanRemoval = true,fetch = FetchType.LAZY,cascade = CascadeType.ALL)private List<Branch> branches;
}@Entity
public class Branch {@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "companyId")private Company company;
}

文章翻译自Stack Overflow:https://stackoverflow.com/questions/11938253/jpa-joincolumn-vs-mappedby

JPA JoinColumn vs mappedBy相关推荐

  1. java jpa @joincolumn 字段不为空_拥抱开源从表设计到 JPA 实现

    long may the sunshine. 今天的我拿起键盘就是猛敲代码. 果然,十分钟后各种 JPA 报错开始了.跟新手党一样,看到一个错误就解决一个,没有好好思考为什么会出现这样的错误. 于是乎 ...

  2. jpa报错:mappedBy reference an unknown target entity property:

    报错信息为: mappedBy reference an unknown target entity property: com.example.accessingdatamysql.entity.O ...

  3. Hibernate中,mappedBy和注解@JoinColumn的对比

    mappedBy 我们知道,mappedBy用于指定具有双向关系的两个实体中.哪个实体是被关联处理的.它有如下四个特点: 1.只有OneToOne,OneToMany,ManyToMany上才有map ...

  4. mappedBy和JoinColumn实质上指向的是同一个表即外键作为主键所在的表对应的实体

    只有双向的时候使用mappedBy mappedBy和JoinColumn实质上指向的是同一个表即外键作为主键所在的表对应的实体(其对应对象1) mappedBy对应实体的声明对象1 JoinColu ...

  5. SpringBoot @ManyToOne @OneToMany JoinColumn mappedBy

    实体关系 MySQL 实体模型共有三种关系,一对一,一对多,多对多,多对一是相对于一对多的. 其中当两者关系为多对多时,必将生成一张关系表,该表的外键为两个实体的ID, 当两者关系为一对多时,有两种处 ...

  6. Spring Hibernate JPA 联表查询 复杂查询

    (转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...

  7. 如何使用JPA注解标注多对多的关系

    假设应用场景如下:Teacher与Student是多对多的关系,其中,Teacher类对应teacher表如下: CREATE TABLE `teacher` (   `id` bigint(20) ...

  8. jpa删除数据后数据库无修改_java – JPA不删除数据库行

    我正面临着JPA的删除问题,这是我的代码: public deleteLine(int idLine) { Line line = em.find(Line.class,idLine); Header ...

  9. java cirteria_java – 简单的JPA CriteriaQuery的条件

    所以这是我第一次尝试使用JPA和CriteriaQuery. 我有以下(简化)实体: @Entity @Table(name = "hours") @XmlRootElement ...

最新文章

  1. 结合实例讲解广域网路由基本技术
  2. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 MethodChannel 通信 )
  3. javascript中json格式转为字符串
  4. python 格式化字符串长度_python-格式化字符串
  5. ant external lib
  6. 如何在 Github 工作流文件里引用自定义实现的 action
  7. Eclipse 报java.lang.OutOfMemoryError: PermGen space错
  8. vue中的适配:px2rem
  9. linux c语言 udp 接收和发送数据用同一个端口_网络编程基础入门及TCP,UDP
  10. 局域网弱口令扫描工具_漏洞扫描软件AWVS的介绍和使用
  11. 01-国内开源镜像站汇总
  12. System.Data.SQLite 支持所有(32位、64位的资源下载包)
  13. win7驱动程序未经签名可以使用吗_win7系统驱动强制数字签名的问题
  14. 计算机网络各章节知识点总结
  15. 实时错误‘429’:ActiveX控件不能创建对象
  16. 关于Vue.js和React.js,听听国外的开发者怎么说?
  17. iOS开发基础之第三方调起自己的App
  18. 【冰点】:重庆“高烧”不退
  19. Micosoft Visual C++ Runtime Library Runtime Error! Program: E:\UserschenliqunAnaconda3\python.exe
  20. 新世纪的群众性幻想与癫狂3

热门文章

  1. C++中引用与指针的区别(详细介绍)
  2. Linux编译程序时加-I指定头文件位置
  3. 阿里P8大佬亲自教你!Android内存泄漏总结,看看这篇文章吧!
  4. php session 释放,php中删除Session和销毁Session的方法
  5. 决策树——ID3和C4.5
  6. git 基本命令和操作
  7. 手把手教你把代码丢入github 中
  8. 几种机器学习算法的优缺点
  9. pjsip视频通信开发(上层应用)之EditText重写
  10. IOS项目中加入Google Admob SDK