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这个方法,它表示什么呢?它表示当前所在表和Person的关系是定义在Person里面的idCard这个成员上面的,它表示此表是一对一关系中的从表,也就是关系是在person表里面维护的 ,这一点很重要 . Person表是关系的维护者,owner side,有主导权,它有个外键指向IDCard。
我们也可以让主导权在IDCard上面,也就是让它产生一个指向Person的外键,这也是可以的,但是最好是让Person来维护整个关系,这样更符合我们正常的思维 .
我们也可以看到在Person里面IDCard是注释是optional=true,也就是说一个人是可以没有身份证的,但是一个身份证不可以没有人,所以在IDCard里面注释person的时候,optional就为false了,这样就可以防止一个空的身份证记录进数据库.
分享到:
相关推荐
@OneToMany(mappedBy = "user") private List<Role> roles; // ... } @Entity public class Role { @Id private Long id; @ManyToOne @JoinColumn(name = "user_id") private User user; // ... } ``` ...
`mappedBy`属性指定了关联的反向属性名称,表示`EntityB`中的哪个属性与`EntityA`相关联。 2. **双向关联**: 双向关联意味着在双方实体中都定义了`@OneToOne`注解。例如,在`EntityA`和`EntityB`中: ```java ...
@OneToMany(mappedBy = "user") private List<Order> orders; // ... } @Entity public class Order { @Id private Long id; @ManyToOne @JoinColumn(name = "USER_ID") private User user; // ... } ``...
`mappedBy`属性用于指定被引用方的属性名。 - **一对多关联 (@OneToMany)**: 表示一个实体可以关联多个其他实体。`@JoinColumn`用于指定外键所在的列,`fetch = FetchType.LAZY`控制加载策略,可选择懒加载或立即...
在上面的代码中,`Person`类中的`profile`属性使用了`mappedBy`属性,表明`Profile`是被关联方,`Profile`类中的`person`属性则使用了`@OneToOne`和`@PrimaryKeyJoinColumn`注解,表示`Person`是关联方,且主键和...
这里,`mappedBy`属性在`User`类中指定了`orders`字段,这意味着`Order`类中的`user`字段是关系的“所有者”。`@JoinColumn`则定义了外键字段名,这里是`user_id`,它将被创建在`Order`表中。 当我们保存`User`对象...
@OneToMany(mappedBy = "user") private List<Role> roles; } @Entity @Table(name = "roles") public class Role { // ... @ManyToOne @JoinColumn(name = "user_id") private User user; } ``` 七、懒...
@OneToMany(mappedBy = "user") private List<Order> orders; } @Entity public class Order { @ManyToOne @JoinColumn(name = "USER_ID") private User user; } ``` 这里,`orders`字段表示用户的一对多关系...
例如,在`Teacher`类中,我们可以定义一个`List<Student>`类型的字段,并使用`@OneToMany(mappedBy = "teacher")`来指定学生实体中的反向引用字段,如`@ManyToOne`注解的`teacher`属性。`mappedBy`属性用于指示关联...
@OneToMany(mappedBy = "user") private List<Order> orders; } @Entity @Table(name = "orders") public class Order { // ... @ManyToOne @JoinColumn(name = "user_id") private User user; } ``` ### 6...
@OneToMany(mappedBy = "user") private List<Order> orders; // 在Order类中 @ManyToOne @JoinColumn(name = "user_id") private User user; ``` 3.2 ManyToMany:表示多对多的关系,如用户与角色的关系: ```java...
对于一对多的双向映射,如果要一对多这一端维护关联关系,你需要删除mappedBy元素并将多对一这端的@JoinColoumn的insertable和updatabel设置为false。这种方案不会得到什么明显的优化,而且还会增加一些附加的UPDATE...
- `@OneToOne`: 表示一对一关联,可以设置`mappedBy`来指定被引用方。 - `@ManyToOne`: 表示多对一关联,通常配合`@JoinColumn`定义外键。 - `@OneToMany`: 表示一对多关联,可以设置`mappedBy`来指定拥有者。 -...
@OneToOne(mappedBy = "husband") public Wife getWife() { return wife; } public void setWife(Wife wife) { this.wife = wife; } } @Entity public class Wife { private Husband husband; @OneToOne...
@OneToMany(mappedBy = "user") private List<Order> orders; ``` 5. **配置SessionFactory**:在使用注解的Hibernate应用中,我们需要配置`SessionFactory`。通常,我们会在`hibernate.cfg.xml`中指定`...
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List<Order> orders; ``` 这表示当用户对象被保存或删除时,关联的订单列表也会进行相应的操作。 7. **索引和唯一性约束(@Index, @...
`mappedBy`在双向一对多或多对一关系中使用,表示关系的维护者。它用于指定哪个实体负责维护关联关系,通常放在不拥有外键的一方。 使用Hibernate的注解,开发者可以更直观地理解对象与数据库的关系,并减少XML...
@OneToMany(mappedBy = "user") private List<Role> roles; } @Entity public class Role { @ManyToOne @JoinColumn(name = "USER_ID") private User user; } ``` 4. **继承策略**:Hibernate支持单表...