首页 > 开发 > 综合 > 正文

Hibernate注解表关联

2024-07-21 02:52:09
字体:
来源:转载
供稿:网友

记录Hibernate注解在表关联时的应用 总共有三张表:采集路线CollectLine ,采集点,目的地 其中采集路线和采集点的关系是一对多 采集线路和目的地的关系是一对一,目的地表 是主表,是关系维护端

@Entity@Table(name = "t_collect_line")public class CollectLine { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) PRivate Long id; //主键 @Column(name = "name", length = 100) private String name;// 采集线路名称 //删除采集线路表时,级联删除属于这个表的采集点 @JSONField(serialize = false) @OneToMany(cascade = CascadeType.ALL, mappedBy = "collectLine", fetch = FetchType.LAZY) private Set<CollectLinePoint> collectLinePoints = new HashSet<CollectLinePoint>();//关联采集点 //删除采集线路表时,级联删除属于这个表的目的地 @JSONField(serialize = false) @OneToOne(cascade = CascadeType.ALL, mappedBy = "collectLine", fetch = FetchType.LAZY) private Destination destination; //关联目的地 //getter setter方法,构造方法}

目的地表

@Entity@Table(name = "t_destination_point")public class Destination extends BaseEntity<Long> { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; //主键 @Column(name = "name", length = 50) private String name;// 名称 @OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, fetch = FetchType.LAZY) @JoinColumn(name = "collect_line_id") private CollectLine collectLine; // 所属线路,目的地表是关系维护端 //getter setter方法,构造方法}

采集点表

@Entity@Table(name = "t_collect_line_point")public class CollectLinePoint extends BaseEntity<Long> { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; //主键 @Column(name = "name", length = 50) private String name;// 名称 @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.EAGER) @JoinColumn(name = "collect_line_id") private CollectLine collectLine;// 所属线路,采集点表是关系维护端 //getter setter方法,构造方法}

主表和从表的区别: 主表负责维护关系,用@JoinColumn注释,从表不用这个注释 从表不负责维护关系,从表的@OneToOne等注释中有mappedBy属性,该属性的值为 在主表中定义的 从表类的字段名 。比如在主表(目的地)中定义的 从表(采集线路表)类的字段名

@JSONField注解 @JSONField是fastjson中的一个注解。在属性头上加上这个注解中,在对对象进行json转换时,该属性,将不会参与格式化。 如果在从表中,定义主表类的属性时不加这个注解,会跑出如下错误 这里写图片描述

@JoinColumn是可选的,关联字段默认值列名为:主体的关联属性名+下划线+被关联端的主键列名. 在这个例子中是collectLine_id, 因为关联的属性是collectLine, 表CollectLine的主键是id.

@Column是可选的,默认值和类的属性名一致

@Temporal主要是用来指明java.util.Date 或 java.util.Calendar 类型的属性具体与数据库(date,time,timestamp)三个类型中的那一个进行映射 例如@Temporal(TemporalType.TIMESTAMP)

@OneToMany等有5个属性 1.casCade 该属性定义类和类之间的级联关系 可选值为CascadeType.PERSIST(级联新建)CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新) CascadeType.ALL 。 2.fetch属性,有两个值 FetchType.EAGER表示关系类(本例是OrderItem类)在主类加载的时候同时加载,FetchType.LAZY表示关系类在被访问时才加载。 默认值是FetchType.LAZY 3.optional = true 该属性可以为null 4.mappedBy 在从表中才定义这个属性 5.targetEntity属性:Class类型的属性。定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。 casCade负责增删改,fetch负责查

//级联修改和更新,该属性不能为null,懒加载@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false,fetch = FetchType.LAZY)@JoinColumn(name = "collect_line_id")private CollectLine collectLine;// 所属线路,采集点表是关系维护端
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表