jpa虚拟表的关系映射和一些坑 特别是多对一 一对多等关系

最近工作中使用了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 注解有冲突 所有我没有使用

还有待补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值