JPA常用数据库操作注解

以User类与Blog类为例

User类

@Entity
@Table(name="t_user")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String nickName;
    private String username;
    private String password;
    private String email;
    private String avatar;
    private String type;
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTmie;

    @OneToMany(mappedBy = "user")
    private List blogs= new ArrayList<>();
}

Blog类

@Entity
@Table(name="t_blog")
public class Blog {
    @Id
    @GeneratedValue
    private Long id;//唯一标识
    private String title;//标题
    private String content;//内容
    private String firstPicture;//首图
    private String flag;//标记
    private Integer views;//浏览次数
    private boolean appreciation;//赞赏开启
    private boolean shareStatement;//转载开启
    private boolean commentabled;//评论开启
    private boolean published;//发布开启
    private boolean recommend;//推荐开启
    @Temporal(TemporalType.TIMESTAMP)
    private Date creatTime;//发布时间
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTime;//更新时间

    @ManyToOne
    private Type type;
    public Blog() {
    }

    @ManyToMany(cascade = {CascadeType.PERSIST})
    private List tags = new ArrayList<>();

    @ManyToOne
    private User user;

    @OneToMany(mappedBy = "blog")
    private List comments = new ArrayList<>();
}
  • 两个类中使用到的有
    @Entity
    标识这个实体类是一个JPA实体,告诉JPA在程序运行的时候记得生成这个实体类所对应的表~!
    @Table(name = "自定义的表名")
    自定义设置这个实体类在数据库所对应的表名!
    @Id
    把这个类里面所在的变量设置为主键Id。
    @GeneratedValue
    设置主键的生成策略,这种方式依赖于具体的数据库,如果数据库不支持自增主键,那么这个类型是没法用的
    @OneToMany
    @ManyToOne
    @ManyToMany
    上述三者均用于标注实体间关系,例如:
    @OneToMany(mappedBy = "user")
    private List blogs= new ArrayList<>();
    表示多个blog对应一个user
    @Temporal
    表示输入数据为插入数据时的时间戳,用于使用到Date类型时需要以此转换类型

  • 其他常用注解
    @Basic
    表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认 即为 @Basic fetch: 表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER.
    @Column(name = "自定义字段名",length = "自定义长度",nullable = "是否可以空",unique = "是否唯一",columnDefinition = "自定义该字段的类型和长度")表示对这个变量所对应的字段名进行一些个性化的设置,例如字段的名字,字段的长度,是否为空和是否唯一等等设置。
    @Transient
    表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient ,否则,ORM框架默认其注 解为 @Basic对于昨天实践的注解已经解析完了啦!那么今天为了接着对JPA表之间的各种关系的映射继续实践,我们再新建几个实体类!
    @Enumerated("需要定义存入数据库的类型”)
    使用@Enumerated映射枚举字段,我这里为性别建立了性别的枚举类型,而后面跟上的是存入数据库以String类型存入。
    @Embedded和@Embeddable
    当一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表,这就是需要使用@Embedded、@Embeddable的时候了。例如:我们在Address里加上了@Embeddable这个注解表示,Address这个类是一个可以被嵌套的类,而在Author类中,我们声明了一个Address类型的变量address,然后给它加上@Embedded注解,意思是我们要在Author类嵌套Address类,当然这里涉及到一个生命周期的问题。我们先看看生成的表再解析一下这个问题!当被引用的对象和主对象拥有相同的生命周期的时候才考虑使用@Embedded和@Embeddable。简单的说就是Author类存在的时候才会有Address类,当Author类不存在的时候,对应Author类所以诞生的Address类也应该是不存在的。通俗的说就是作者存在的时候才会有这个作者的地址。而不会是有一个地址存在着却没有人属于这个地址。而且内嵌类会和主类生成一张表,所以内嵌类对应主类应该是要唯一的和拥有相同生命周期的。
    @ElementCollection
    集合映射,当实体类包含多个相同类型的变量的时候就可以使用@ElementCollection来声明这个变量,而JPA会为此生成两个关联的表。例如一个人有家庭住址,也有单位地址;但是“地址”并不能失去人的存在而存在,所以是一个失去独立性的实体类;所以地址不能映射为一个实体,这时就需要映射为组件,及人的信息里边包含地址。是整体与部分的关系。但由于这个地址可能有多个。比如公司地址、出生地址、家庭地址等。
    @Transactional
    注解的属性
    name 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。
    propagation 事务的传播行为,默认值为 REQUIRED。
    isolation 事务的隔离度,默认值采用 DEFAULT。
    timeout 事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚务。
    read-only 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
    rollback-for 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
    no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。
    总结为通过该项注解使得对某些方法的覆写而成为监控事务。
    @Autowired
    @Autowired是一种注解,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。@Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上,也可以放在任意方法上表示,自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。
    @Service
    标注后对类进行自动注册spring容器,例如:
    @Service用于标注业务层组件,@Controller用于标注控制层组件(如struts中的action),@Repository用于标注数据访问组件,即DAO组件,用于逻辑组件分组
    @Mapping
    分类使用为GetMapping,PostMapping,RequestMapping
    例如:GetMapping用于get请求监控、
    PostMapping用于post请求监控
    RequestMapping用于全局监控,以及后面皆在它的监控下再次监控路径下请求

你可能感兴趣的:(JPA常用数据库操作注解)