今天聊一下关于 Many/One To Many/One 的一些思考。

在此之前记住一个东西, 叫 暗恋 = (单方面愿意, 但是对方需要接受你才会有影响, 影响力的结果中间产物(小孩))

首先先简单的介绍两个模型 Goods, Category;

/**
 * 商品
 */
public class Goods {

    // 1. 此处填写 应该是什么关联模型
    private Category category;

}

/**
 * 商品类别
 */
public class Category {
 
  // 2. 此处该不该有 goodsList

}

问题1: 此处应该写什么关联模型

(1) @OneToOne
首先就 Pass 了, 这种模型只适合, 一个人 值拥有一个 IdCard 的情况;
结论: 会与关联表产生唯一键约束, 因为是一对一, 所以会到当前表创建一个类型字段, 为什么是当前表, 从模型的角度来考虑, 因为修改的是当前对象, 从设计的角度就不应该会影响到其他对象, 事实也是如此, 记住这个点 (影响) ;
(2) @ManyToOne
多个商品只有一个类型, 并且 多个商品对应一个类型, 符合当前情况;
结论: 会给当前表添加一个外检, 连接类型 (那为什么不在 Category 对象中添加 @OneToMany, 这样从对象的影响来看, 会创建一个 中间表, 即便你觉得很奇怪, 但是从设计的角度去考虑, 也就不应该去影响其他实体);

这里很多人不明白, 但是有时候又需要从 类型中查询到所有的商品, 但是创建出来的表又是这样, 很奇怪的设计, 很多时候我们需要从 对方去考虑, 考虑是否有影响 和其他的一些东西;

(3) @ManyToMany
商品会有多个类型;
结论: 会创建中间表, 存储数据, 受影响内容, ManyToMany, 如果是单项会创建中间表, 对其他对象没有影响, 如果对方对象也和你一样 设置了 ManyToMany , 这中间表属于你两共同的;

问题2: Category 下该不该有 Goods List
答: 首先的结论是, 大部分情况否定的。 为什么, 我们从对象的维度去思考.
以下 Goods -> @XXToXX 参考 问题1 对象来看;

(1) @OneToOne, private Goods goods, 他是可以拥有的;
(2) @OneToMany, 不需要;
(3) @ManyToMany, 需要;

这里可能要注意一下不要弄混了, Goods 和 Category 相反的问题;

这个问题, 有一个很好的方法去记, 就是 喜欢不是单方面的, 需要对方接受你, 才会有影响, 单方面是不会影响到其他对象的.

常见问题

/**
 * 商品
 */
public class Goods {

    
    @ManyToOne
    private Category category;

}

/**
 * 商品类别
 */
public class Category {
 
  @OneToMany
  private List<Goods> list;

}

会产生的结果为什么和预期不一致, 我们从 Category 的角度去思考, 因为Category单方面去增加了 Goods List,他为了不影响 Goods 创建了中间表,

Goods 为什么自己又加了一个 category 字段 Goods 表中, 因为 单个对象会添加列, List 才会 创建中间表, 单列无法表示 List;