JPA 学习

简介: JPA 学习
AuditingEntityListener AuditorAware EnableJpaAuditing
@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy
说明

当实体类insert或者save的时候会自动填充 上面的几个值

LastModifiedBy CreatedBy 会根据AuditorAware实现类来决定 怎么赋值

@MappedSuperclass 用在父类上 防止生成Base表
japrespository

Respository-CrudRespository-PagingAndSortingRespository–JpaRespository

JpaSpecificationExcutor

@PersistenceContext(name=“entityManagerFactory”)

EntityManager em

方法命名规则条件查询

@query 注解sql查询 jpql

查询 select


@Modifying

更新 update


@Transactional 事务

@Rollback(false)


find

find属性 默认做相等判断


find属性Is


find属性Equal


find属性Like


一对一

//cascade=CascadeType.PERSIST 开启级联操作

@OneToOne(cascade=CascadeType.PERSIST)

//维护一个外键

@JoinColumn(name=“roles_id”)

private Roles roles


@OntToOne(mappedBy=“roles”)

private Users users


一对多

//cascade=CascadeType.PERSIST 开启级联操作

@ManyToOne(cascade=CascadeType.PERSIST)

//维护一个外键

@JoinColumn(name=“roles_id”)

private Roles roles


@OneToMany(mappedBy=“roles”)

private Set users = new HashSet<>()


多对多

@ManyToMany(cascade=CascadeType.PERSIST,fetch=“FetchType.EAGER”)

//@JoinTable:配置中间表信息

//joinColumns:建立当前表在中间表中的外键字段

@JoinTable(name=“t_roles_menus”,joinColumns=@JoinColumn(name=“role_id”),inverseJoinColumns=@JoinColumn(name=“menu_id”))

private Set menus = new HashSet<>();


@ManyToMany(mappedBy=“menus”)

private Set roles = new HashSet<>();


查询前6个

findTop6By…

其他学习
mappedby

只有 @OneToOne, @OneToMany, @ManyToMany上才有 mappedBy 属性,@ManyToOne不存在该属性。

该属性的作用:

设置关联关系。单向关联关系不需要设置,双向关系必须设置,避免双方都建立外键字段。


对于 一对多 的关系,外键总是建立在多的一方(用到@JoinColumn),而 mappedBy 存在相反的一方。

多对多的关系 推荐在被动的一方放弃维护

维护的一方set可以插入数据,放弃维护的一方不可以

用到@JoinColumn可以使用setXXX插入数据


将 “一” 的一方称为 :主表。

将 “多” 的一方称为 :从表。


使用 @JoinColumn

定义外键(在从表上定义,name指的是 外键名(类名+id(主键),本表中的一个字段最好自己创建),

referencedColumnName 默认指向另外一个表的主键,如果不是就需要该字段指定其他表字段)


一主多从,从维护(可以set),维护用再join上

  //OrderItem
    @Column(name = "id_goods", columnDefinition = "BIGINT COMMENT '商品id'")
    private Long idGoods;
    @JoinColumn(name = "id_goods", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
    @ManyToOne(fetch = FetchType.LAZY)
    private Goods goods;
  
  
  //Order
  @Column(name="id_user",columnDefinition = "BIGINT COMMENT '用户id'")
    private Long idUser;
    @JoinColumn(name="id_user", referencedColumnName="id",insertable = false, updatable = false,foreignKey = @ForeignKey(name="none",value = ConstraintMode.NO_CONSTRAINT))
    @ManyToOne(fetch = FetchType.LAZY)
    private ShopUser user;
  
  

  //Order
  @OneToMany(cascade = {CascadeType.ALL})
    @JoinColumn(name = "id_order")
    @org.hibernate.annotations.ForeignKey(name="none")
    private List<OrderItem> items;
多表查询学习

join

POJO (DO DTO VO)

POJO Plain Ordinary Java Object

POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等

DO Data Object

DTO Data Transfer Object

VO View Object

常用注释
   @Column(columnDefinition = "BIGINT COMMENT '栏目id'")
    @NotNull(message = "栏目不能为空")
    private Long idChannel;
  
  @Column(columnDefinition = "VARCHAR(128) COMMENT '标题'")
    @NotBlank(message = "标题不能为空")
  private String title;
  
   @Column(columnDefinition = "TEXT COMMENT '内容'")
    @NotBlank(message = "内容不能为空")
   private String content;
   
   @Column(columnDefinition = "VARCHAR(64) COMMENT '作者'")
    private String author
  
   @Column(columnDefinition = "VARCHAR(32) COMMENT '电子邮箱'")
    @NotBlank(message = "电子邮箱不能为空")
    private String email;
  
  @Column(name = "type", columnDefinition = "VARCHAR(32) COMMENT '消息类型,0:短信,1:邮件'")
    private Integer type;
  
  
  @Column(name = "cfg_name", columnDefinition = "VARCHAR(256) COMMENT '参数名'")
    private String cfgName;
  
  
  @Column(columnDefinition = "INT COMMENT '顺序'", nullable = false)
    private Integer num;
  
  
  @Column(columnDefinition = "tinyint COMMENT '是否隐藏'")
    private Boolean hidden = false;
  
  
  @Column(name = "modify_time", columnDefinition = "DATETIME COMMENT '最后更新时间'")
    private Date modifyTime;
Projection (投影映射)
/**
 * 使用spring data jpa 的 Projection (投影映射)
 * 该部分是很有趣的一部分,简单容易操作, Projection 是要解决什么问题呢?
 * <p>
 * 当我们使用 spring data jpa 查询数据的时候,有时候不需要返回所有字段的数据,我们只需要个别字段数据,这样使用 Projection 也是不错的选择
 */
public interface StudentProjection {
    String getName();

    Integer getAge();

    @Value("#{target.name+'and age is'+target.age}")
    String getName2();
}
jackjson

@JsonManagedReference 放弃维护 只读 反序列化有数据不忽略

@JsonBackReference 维护的一方 只写 序列化的时候忽略

@JsonIgnoreProperties(value = {“age”}) 反序列化和序列化都忽略

相关文章
|
2月前
学习putpixel画点
学习putpixel画点。
25 3
|
2月前
|
存储 供应链 机器人
5 天学会阿里云 RPA:基础知识
阿里云 RPA(Robotic Process Automation)是一种软件技术,它可以模拟人类在计算机上的操作,从而实现自动化的流程执行。通过使用阿里云 RPA,企业可以减少重复性的手动操作,提高工作效率和准确性,同时降低人力成本和错误率。
|
1天前
|
人工智能 机器人
RPA是什么?为啥要学习RPA,看这篇就够了
RPA是什么?为啥要学习RPA,看这篇就够了
14 2
|
10月前
|
Python
学习阿里云RPA
学习阿里云RPA
201 1
|
9月前
|
存储 C++ 容器
C++进阶之一篇文章教会你什么是map和set(下)
6.set观察器和操作成员函数 Observers key_comp(返回键的比较对象): key_compare key_comp() const;
|
9月前
|
存储 自然语言处理 算法
C++进阶之一篇文章教会你什么是map和set(上)
序列式容器和关联式容器 序列式容器: 序列式容器是一组用于存储数据的容器,其中的数据按照它们在容器中的位置进行存储和访问。序列式容器提供了对元素的线性访问和操作,其主要特点包括:
|
人工智能 城市大脑 达摩院
学习+思考+资料总结
基本结构 程序 = 算法+数据结构 软件 = 程序 + 软件工程 软件企业 = 软件 + 商业模式 闲是灵感的源泉,忙是思维的坟墓。
84 0
|
程序员 编译器 C++
C++学习——前进(三)
C++学习——前进(三)
75 0
C++学习——前进(三)
|
存储 分布式计算 资源调度
【Spark】【复习】Spark入门考前概念相关题复习
【Spark】【复习】Spark入门考前概念相关题复习
335 0
|
人工智能 Oracle 机器人
阿里云RPA这么火,我们要去学习使用吗?
学会了RPA技术,你就可以通过一些流程设计让他帮你去完成一些大量重复、枯燥的工作,平常你需要花费一上午、一下午才能完成的工作,RPA十分钟就可以解决,这样省下来的时间你就可以去发呆、思考、追剧等等你感兴趣的事情。这,难道它不香吗?
阿里云RPA这么火,我们要去学习使用吗?

热门文章

最新文章