MappedBy

对于mappedBy复习下:

a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性; 
b) mappedBy标签一定是定义在the owned side(被拥有方的),他指向the owning side(拥有方);
c) mappedBy的含义,应该理解为,拥有方能够自动维护 跟被拥有方的关系; 
   当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的。

d) mappedBy跟JoinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被 拥有方。mappedBy这方定义的JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表

 


人跟身份证双向关联

在Person 里面定义的注解:

@OneToOne(cascade={CascadeType.ALL},optional=true) 
public IDCard getIdCard() { 
         return idCard; 
}

在IDCard 里面定义的注释: 
@OneToOne(cascade=CascadeType.ALL,mappedBy="idCard" , optional=false) 
public Person getPerson() { 
       return person; 

多了一个mappedBy这个方法,它表示什么呢?它表示当前所在address表和Person的关系是定义在Person里面的idCard这个成员上面的,它表示此表address是一对一关系中的从表,也就是关系是在person表里面维护的 ,这一点很重要 . Person表是关系的维护者,owner side,有主导权,它有个外键指向IDCard。 
我们也可以让主导权在IDCard上面,也就是让它产生一个指向Person的外键,这也是可以的,但是最好是让Person来维护整个关系,这样更符合我们正常的思维 .

我们也可以看到在Person里面IDCard是注释是optional=true,也就是说一个人是可以没有身份证的,但是一个身份证不可以没有人,所以在IDCard里面注释person的时候,optional就为false了,这样就可以防止一个空的身份证记录

进数据库.




  1. @Entity  
  2. @Table(name = "userInfo", schema = "dbo", catalog = "oa", uniqueConstraints = @UniqueConstraint(columnNames = "name"))  
  3. public class UserInfo implements java.io.Serializable {  
  4. private Integer userId;  
  5.   
  6.     private DepartmentInfo departmentInfo;  
  7. //other field  
  8.   
  9. @ManyToOne(fetch = FetchType.LAZY)  
  10.     @JoinColumn(name = "departmentId", nullable = false)  
  11.     public DepartmentInfo getDepartmentInfo() {  
  12.         return this.departmentInfo;  
  13.     }  
  14.   
  15. //other getter setter  
  16. }  

Java代码   收藏代码
  1. @Entity  
  2. @Table(name = "departmentInfo", schema = "dbo", catalog = "oa")  
  3. public class DepartmentInfo implements java.io.Serializable {  
  4. private Integer departmentId;  
  5. private Set<UserInfo> userInfos = new HashSet<UserInfo>(0);  
  6. //other field  
  7. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "departmentInfo")  
  8.     public Set<UserInfo> getUserInfos() {  
  9.         return this.userInfos;  
  10.     }  
  11. //other getter setter  
  12. }  
  13. 上面是一对多,多对一关系,DepartmentInfo 实体和UserInfo实体 的关系保存在表userInfo中的
  14. 所以在DepartmentInfo 实体中使用mappedBy属性,在UserInfo实体中使用 
  15. @JoinColumn属性。
mappedBy表示被拥有者是 departmentInfo表,        拥有者是userInfo表,

在 JPA(Java Persistence API)中,`mappedBy` 和 `cascade` 是用于配置实体之间关系的重要属性。下面分别对它们进行详细介绍: --- ### 1. **`mappedBy="post"`** #### 背景知识 - 在双向关联中(即两个实体相互引用对方),JPA 需要知道哪一个实体负责维护数据库中外键的实际值。 - 这里的 `"post"` 表示外键由另一侧(`Post` 实体)管理。 #### 含义 当你在一个实体中定义了双向关联时(例如 OneToMany 或 ManyToOne 关系),`mappedBy` 告诉 JPA: - 当前的关系是由另一个实体的某个字段所映射的。 - 它的作用是告诉框架“这个关系不需要生成新的外键列”,而是复用已经存在的外键约束。 #### 示例代码片段 假设有一个 `Comment` 和 `Post` 的一对多关系: ```java @Entity public class Post { @Id private Long id; @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List<Comment> comments = new ArrayList<>(); } @Entity public class Comment { @Id private Long id; // 拥有外键的一方 @ManyToOne @JoinColumn(name = "post_id") private Post post; } ``` 在这个例子中: - `@ManyToOne` 注解下的 `Comment.post` 才真正拥有指向 `Post` 的外键列 (`post_id`)。 - 因此,在 `Post.comments` 中我们使用了 `mappedBy="post"` 来表示它是被动一方,而不是主动去建立新表结构。 --- ### 2. **`cascade=CascadeType.ALL`** #### 背景知识 级联操作是一种机制,它使得当主实体发生某些变化时(如保存、更新或删除),相关的从属实体也能自动应用相同的变更。 #### Cascade 类型选项 以下是常见的几种级联类型及其含义: - `CascadeType.PERSIST`: 主实体持久化时也同时保存其相关联的子实体; - `CascadeType.MERGE`: 更新主实体的同时合并所有关联的子项; - `CascadeType.REMOVE`: 删除主记录会触发连带移除那些依赖它的子条目; - `CascadeType.DETACH`: 分离状态传递给关联对象; - `CascadeType.REFRESH`: 刷新主实体的时候刷新关联的数据; - `CascadeType.ALL`: 包含以上所有的行为,默认采用全部四种动作一起执行。 #### 应用场景 如果我们将 `cascade=ALL` 设置到上面提到的那个 `@OneToMany` 上,则意味着每当处理完 `Post` 对象之后都会对其包含的所有评论做同样的事情——无论是插入还是修改甚至是销毁整个帖子都将一并清除掉属于该贴文的一切留言信息。 --- ### 总结 上述两部分结合在一起表明了一个典型的父子层级体系设定规则:指定哪一边来主导双方之间的联系并通过参数确定何时以及如何同步变动至配对端点上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值