Preface: 希望你之前有用过Jpa。参考Spring data书籍学习,并且提炼其中有用的东西,有些知识点,可能在工作也没有用到过,但却将来会用到。若我发现书中有错,我也会在这里指出。最后会有代码传送门。
@MappedSuperclass
此注解上面的类不是作为一张表,也不是一个实体类,此注解的类会将其属性带到继承它的类的表中。所以可以把公共的属性抽取出来放在此注解的类下面。如id生成
@Embeddable
注解的中文意思就是“可嵌入的”这个注解有点意思,此注解的将其属性放到包含它的类的所对应的表中。此注解的类通常用来表述领域的概念,而领域本身可以做一些约束,如邮箱,开始时间和结束时间(开始时间肯定早于结束时间),但是我以前看过很多别人写的代码都是在自己的Controller里面做判断,或者做个自定义注解,当你get到这个注解用法 ,公司的项目开始的时候就可以为你公司制定好规范
当时我在看书的时候我就留意(unique = true)这里。我实操的时候发现unique属性其实是不起作用的。唯一性的结束不起作用,而且这种唯一其实只是在generateDDL的时候会有用,其实真正校验还是交还给DB, 如果想让应用在建表的时候做唯一约束可以在类上加
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"email"})})
其中email这个属性就是数据库表里面的字段名字。在应用运行的时候是不起作用,在启动应用,如果你让应用自己去建表的,在你启用应用配置spring.jpa.hibernate.ddl-auto=create-drop
日志上面会有:
也就是往数据库里面加了唯一结束。
Address的生命周期受Customer控制,在领域驱动设计术语中,Customer称为聚合根(aggregate root)
@ElementCollection
上面会创建一个表名为product_attributes,然后有表字段有attributes,attributes_key.但是在生产当中我们通常会以下面这种用法:
@Entitypublic
class Product extends AbstractEntity {
@Column(nullable = false)private String name;
//... SOME CODE HERE @ElementCollection//name 指定表名 att,外键 att_id
@CollectionTable(name = "att" , joinColumns = @JoinColumn(name = "att_id"))
private Map<String, String> attributes = new HashMap<String, String>();
}
数据库中的表是这样子
花了点时间写了这篇文章,但感觉干货并不多。
传送门:https://github.com/AdrainHuang/spring-data-study