当为@xxxToOne时:@JoinColumn(name="addressID") //注释本表中指向另一张表的 (本表中的外键)外键。
在person中:
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="personID")//注释的是另一个表指向本表的外键。
public List<Phone> getPhones() {
return phones;
}
person中:
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="personID")//注释的是另一个表指向本表的外键。
public List<Phone> getPhones() {
return phones;
}
在这里@JoinColumn这个注释指的却是在Phone里面的外键的列的名字,如果你不加 @JoinColumn(name="personID")这个注释的话,那么JBOSS就会自动帮你生成一张中间表
而person注解如下:
@ManyToOne
@JoinColumn(name="countryID")
public Country getCountry() {
return country;
}
在这里如果我们去掉@JoinColumn的话,那么一样会在Person表里面生成一列指向
Country的外键,这一点和一对多的单向是不一样
总结:
在@ManyToOne中,即便不添加:@JoinColumn(name="countryID"),任然会在该类对应的表中添加一个指向country的外键
而在@OneToMany中,不添加@JoinColumn(name="personID"),是不会自动在其对应的类中添加外键的,
3.多对多中,joinColumns写的都是本表在中间表的外键名称,
inverseJoinColumns写的是另一个表在中间表的外键名称。
mappedBy:
1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
2>mappedBy标签一定是定义在拥有方类上被拥有方字段上的,并指向拥有方;
3>mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系,当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的;
4>mappedBy跟joinColumn/JoinTable总是位于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。
mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。
orm 与jpa:http://www.cnblogs.com/holbrook/archive/2012/12/30/2839842.html#sec-3-1
在属性上标注 @Temporal(TemporalType.TIMESTAMP) 会得到形如'HH:MM:SS' 格式的日期
方法上标注@PrePersist,@PostPersist等声明即可在事件发生时触发这些方法
mappedBy="roles":appedBy 属性定义了roles为双向关系的维护端
@Transient表示该属性并非一个到数据库表的字段的映射
FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载
FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载
CascadeType.MERGE级联更新:若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法
CascadeType.PERSIST级联刷新:获取order对象里也同时也重新获取最新的items时的对象
Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可。
对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据
CascadeType.REFRESH级联保存:对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法
CascadeType.REMOVE级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法
CascadeType.PERSIST只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)
在person中:
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="personID")//注释的是另一个表指向本表的外键。
public List<Phone> getPhones() {
return phones;
}
person中:
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="personID")//注释的是另一个表指向本表的外键。
public List<Phone> getPhones() {
return phones;
}
在这里@JoinColumn这个注释指的却是在Phone里面的外键的列的名字,如果你不加 @JoinColumn(name="personID")这个注释的话,那么JBOSS就会自动帮你生成一张中间表
而person注解如下:
@ManyToOne
@JoinColumn(name="countryID")
public Country getCountry() {
return country;
}
在这里如果我们去掉@JoinColumn的话,那么一样会在Person表里面生成一列指向
Country的外键,这一点和一对多的单向是不一样
总结:
在@ManyToOne中,即便不添加:@JoinColumn(name="countryID"),任然会在该类对应的表中添加一个指向country的外键
而在@OneToMany中,不添加@JoinColumn(name="personID"),是不会自动在其对应的类中添加外键的,
3.多对多中,joinColumns写的都是本表在中间表的外键名称,
inverseJoinColumns写的是另一个表在中间表的外键名称。
mappedBy:
1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
2>mappedBy标签一定是定义在拥有方类上被拥有方字段上的,并指向拥有方;
3>mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系,当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的;
4>mappedBy跟joinColumn/JoinTable总是位于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。
mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。
orm 与jpa:http://www.cnblogs.com/holbrook/archive/2012/12/30/2839842.html#sec-3-1
在属性上标注 @Temporal(TemporalType.TIMESTAMP) 会得到形如'HH:MM:SS' 格式的日期
方法上标注@PrePersist,@PostPersist等声明即可在事件发生时触发这些方法
mappedBy="roles":appedBy 属性定义了roles为双向关系的维护端
@Transient表示该属性并非一个到数据库表的字段的映射
FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载
FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载
CascadeType.MERGE级联更新:若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法
CascadeType.PERSIST级联刷新:获取order对象里也同时也重新获取最新的items时的对象
Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可。
对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据
CascadeType.REFRESH级联保存:对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法
CascadeType.REMOVE级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法
CascadeType.PERSIST只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)