概述
最近工作中使用了jpa 发现这种ROM 映射框架的坑特别多特别是关于表关系
的坑,废话不多说,主要介绍一些表关系的定义.
第一个一对多
这里使用@Getter@Setterr的原因是@Data在一些双向的 一对多 和 多对一 还有多对多 关系中可能会发生tostring循环打印
这里使用@NoArgsConstructor 无参构造方法 防止插入表的时候报错;反正你标上就没问题
@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "motor_exam_result_info")
public class ExamResultInfo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinColumn(name = "result_info_id", referencedColumnName = "id")
private List<ExamResultItem> examResultItemList;
}
特别注意 一对多关系中只需要一方维护这种关系的原因是因为 我只查这张表 我把它作为主表,所以我只需要一方建立关系就行了
@GeneratedValue(strategy = GenerationType.IDENTITY)
主键自增的策略 :推荐使用 和b+树生成索引有关 其他的生成主键策略也会发生原因不明的报错
@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
cascade = {CascadeType.ALL} 联级策略
所有操作
ALL,
持久化
PERSIST,
合并
MERGE,
删除
REMOVE,
刷新
REFRESH,
分离
DETACH
包括更新 删除 插入 合并和分离的作用不明
但是没有只读操作 我对这点非常迷惑 但是 mappdeby 有这种作用 放弃对另一张表的所有操作
fetch = FetchType.EAGER在查询中采用立即加载策略 比较耗费性能
还有一种懒加载 没有在查询的参数中携带的对象不会被查询出来 节省性能
private List examResultItemList; 就比如这个list
但是会触发no session错误
@JoinColumn(name = “result_info_id”, referencedColumnName = “id”)
外键关联
name在一对多中 name填的是 多的那一张表的外键 referencedColumnName 那个外键对应 一的表的主键
另一张表:
多的那张表
@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "motor_exam_result_item")
public class ExamResultItem implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "result_info_id")
private Long resultInfoId;}
下面这张表和上面的没有关系
@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "motor_exam_misjudge_application")
public class MotorExamMisjudgeApplication implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "result_points_id")
private Long resultPointsId;
@ManyToOne(targetEntity = MotorExamResultPoints.class,cascade = CascadeType.ALL)
@JoinColumn(name = "result_points_id",referencedColumnName = "id",insertable = false,updatable = false)
private MotorExamResultPoints motorExamResultPoints;
}
这是多对一的关系
前面的注解都一样
targetEntity = MotorExamResultPoints.class
是表示我多对一 一的映射的表对应的类 不加上去会让系统不知道你这个result_points_id 键对应的是谁
@JoinColumn 中的name填的始终是 多的一方的外键 referencedColumnName填的是一的一方的主键 当然你也可以不放主键
视情况而定 只要是唯一值就是 比如流水号 扣分代码 等等
重点:
insertable = false,updatable = false 这两个参数会让你放弃对另一方的更新和插入操作 因为你是多的一方 可能会有其他表关联了一的表的主键
作用相当于@OnetoMany 中的mappdeby mappdeby和@JoinColumn 注解有冲突 所有我没有使用
还有待补充
最后
以上就是谦让大树为你收集整理的jpa虚拟表的关系映射和一些坑 特别是多对一 一对多等关系的全部内容,希望文章能够帮你解决jpa虚拟表的关系映射和一些坑 特别是多对一 一对多等关系所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复