⼀对⼀关联查询注解@OneToOne的实例详解(⼀)
⼀对⼀关联查询注解@OneToOne的实例详解
  表的关联查询⽐较复杂,应⽤的场景很多,本⽂根据⾃⼰的经验解释@OneToOne注解中的属性在项⽬中的应⽤。本打算⼀篇博客把增删改查写在⼀起,但是在改的时候遇到了⼀些问题,感觉挺有意思,所以写下第⼆篇专门讲修改。
⼀、单向@OneToOne实例详解
假设⼀个场景,⼀个⼈只能领养⼀只宠物,根据⼈能够到宠物,并且查看宠物的信息,关系是单向的。
创建⼈与宠物的数据表结构。下载地址:Person,Pet数据库建表。
创建实体。
Person.java
del;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.springframework.beans.factory.annotation.Autowired;
@Entity
@Table(name ="person")
public class Person  implements Serializable{
@Id
// id⾃动⽣成
@GeneratedValue
@Column(name ="id")
private Long id;
@Column(name ="name")
private String name;
//cascade:表的级联操作
@OneToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)//JPA注释:⼀对⼀关系//referencedColumnName:参考列名,默认的情况下是列表的主键
//nullable=是否可以为空,
//insertable:是否可以插⼊,
//updatable:是否可以更新
// columnDefinition=列定义,
//foreignKey=外键
@JoinColumn(name="pet_id",referencedColumnName="id",nullable=false)
private Pet pet;
@Override
public String toString(){
return"Person [id="+ id +", name="+ name +", pet="+ pet +"]";
}
}
Pet.java
del;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name ="pet")
public class Pet  implements Serializable{
@Id
// id⾃动⽣成
@GeneratedValue
@Column(name ="id")
private Long id;
@Column(name ="pet_name")
private String petName;
@Column(name ="pet_class")
private String petClass;
//省略set,get⽅法。
@Override
public String toString(){
return"Pet [id="+ id +", petName="+ petName +", petClass="
+ petClass +"]";
}
} 
注解@OneToOne的接⼝定义如下:
public interface OneToOne extends Annotation {
public abstract Class targetEntity();
public abstract CascadeType[]cascade();
public abstract FetchType fetch();
public abstract boolean optional();
public abstract String mappedBy();
public abstract boolean orphanRemoval();
}
注解@OneToOne的属性:
cascade:关联属性,这个属性定义了当前类对象操作了之后,级联对象的操作。本例中定义了:CascadeType.ALL,当前类增删改查改变之后,关联类跟着增删改查。
fetch属性:FetchType类型的属性。可选择项包括:FetchType.EAGER 和FetchType.LAZY。 FetchType.EAGER表⽰关系类(本例是OrderItem类)在主类加载的时候同时加载,FetchType.LAZY表
⽰关系类在被访问时才加载。默认值是FetchType.LAZY。
mappedBy:拥有关联关系的域,如果关系是单向的就不需要,双向关系表,那么拥有关系的这⼀⽅有建⽴、解除和更新与另⼀⽅关系的能⼒,⽽另⼀⽅没有,只能被动管理,这个属性被定义在关系的被拥有⽅。双向@OneToOne,双向@OneToMany,双向
@ManyToMany。
注解@JoinColumn的接⼝定义:
public interface JoinColumn extends Annotation {
public abstract String name();
public abstract String referencedColumnName();
public abstract boolean unique();
public abstract boolean nullable();
public abstract boolean insertable();
public abstract boolean updatable();
public abstract String columnDefinition();
public abstract String table();
public abstract ForeignKey foreignKey();
}
注解@JoinColumn的属性:
name属性:外键列的名称,默认情况下是:引⽤实体的字段名称 +“_”+ 被引⽤的主键列的名称。⼀般也可以⾃定义,⼀般见名知意,就可以采⽤默认值。
referencedColumnName属性:参考列,默认值是关联表的主键。例如你可以定义pet_name为参考列,那么就会将pet的name的值关联到这⼀列。
创建类:TableRelationController
troller;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONObject;
del.GoodInfoEntity;
service.TableRelationService;
/**
* ⽤于测试表的七种对应关系
* @author by_ww
*
*/
@RestController
@RequestMapping(value ="/tableRelation")
public class TableRelationController {
@Resource
private TableRelationService tableRelationService;
// 增加
@RequestMapping(value ="/save")
public Long save(@RequestBody JSONObject record)throws Exception
{
return tableRelationService.save(record);
}
// 查询
@RequestMapping(value ="/query")
public JSONObject query(@RequestBody JSONObject record)throws Exception {
Pet(record);
}
// 删除
@RequestMapping(value ="/delete")
public Long delete(@RequestBody JSONObject record)throws Exception
{
return tableRelationService.delete(record);object to
}
// 更改
@RequestMapping(value ="/update")
public Long update(@RequestBody JSONObject record)throws Exception
{
return tableRelationService.update(record);
}
}
创建TableRelationService类:
service;
import javax.annotation.Resource;
import javax.persistence.EntityManagerFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ansaction.annotation.Transactional;
import com.alibaba.fastjson.JSON;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。