前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用javax.persistence注解配置PO对象

使用javax.persistence注解配置PO对象

原创
作者头像
用户4396583
修改2024-07-30 17:09:57
2620
修改2024-07-30 17:09:57
举报
文章被收录于专栏:spring-boot 注解

简介

在Java中,javax.persistenceJava Persistence API(JPA)的一部分,它提供了一种机制来管理Java应用程序中的对象持久化。其中,属性注释是一种用于描述实体类中属性的注释,它可以帮助开发人员更好地理解和配置实体类的属性

@Entity注释

在JPA中,@Entity注释用于标识一个类作为一个实体类。一个实体类对应数据库中的一张表。下面是一个使用@Entity注释的例子:

代码语言:java
复制
@Entity
public class User {
    // 属性声明省略...
}

在上面的例子中,User类被标记为实体类,并将对应于数据库中的一张表。

@Id注释

在JPA中,@Id注释用于标识一个属性作为实体类的主键。一个实体类必须有一个主键,用于唯一标识该实体类的记录。下面是一个使用@Id注释的例子:

代码语言:java
复制
@Entity
public class User {
    @Id
    private Long id;
    // 其他属性声明省略...
}

在上面的例子中,id属性被标记为主键,它将对应于数据库表的主键列。

@Column注释

在JPA中,@Column注释用于标识一个属性对应于数据库表的一列。通过@Column注释,开发人员可以对数据库列进行更详细的配置。下面是一个使用@Column注释的例子:

代码语言:java
复制
@Entity
public class User {
    @Id
    private Long id;
    
    @Column(name = "user_name", length = 50, nullable = false)
    private String userName;
    
    // 其他属性声明省略...
}

在上面的例子中,userName属性被标记为对应于数据库中的"user_name"列,它的长度为50,并且不允许为空。

#@Temporal

关于日期类型,Java和数据库表示的方法不同:

  • Java:只有java.util.Date和java.util.Calender两种;
  • 数据库:date、time、datetime、timestamp等;

当在持久化类定义了一个java.util.Date类型的属性时,Hibernate到底将该类型的属性定义成date类型、time类型还是timestamp类型?

方式一:@Temporal(TemporalType.DATE)映射为日期 // birthday date (只有日期)

方式二:@Temporal(TemporalType.TIME)映射为日期 // birthday time (是有时间)

方式三:@Temporal(TemporalType.TIMESTAMP)映射为日期 //birthday datetime (日期+时间)

两种使用方式:

字段上:

代码语言:java
复制
@Temporal(TemporalType.TIMESTAMP)
@Column(name = “regist_time”)
private Date registTime;

get方法上:

代码语言:java
复制
@Temporal(TemporalType.TIMESTAMP)
public Date getRegistTime(){
    return registTime;
}

@Lob

@Lob注释表示该属性持久化为Blob或者Clob类型,具体取决于属性的类型

方式一:

代码语言:java
复制
@Lob
private String text;   //text longtext

方式二:

代码语言:java
复制
@Lob
private byte[] image;	// image longblob

@GeneratedValue注释

在JPA中,@GeneratedValue注释用于标识一个属性的值是自动生成的。一般情况下,自动生成的值用于主键属性。下面是一个使用@GeneratedValue注释的例子:

代码语言:java
复制
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    // 其他属性声明省略...
}

在上面的例子中,id属性被标记为自动生成的主键值。@GeneratedValue注释中的strategy参数指定了生成主键值的策略,IDENTITY表示使用数据库的自增策略。

@Transient注释

在JPA中,@Transient注释用于标识一个属性不需要持久化到数据库中。这个属性的值在数据库中不会有对应的列。下面是一个使用@Transient注释的例子:

代码语言:java
复制
@Entity
public class User {
    @Id
    private Long id;
    
    @Transient
    private String tempData;
    
    // 其他属性声明省略...
}

在上面的例子中,tempData属性被标记为不需要持久化到数据库中。

@Enumerated

首先我们要明确的是将Enum类型的字段映射到数据库中有两种方式:

  • 通过使用Enum类型实例在Enum中声明的顺序,也就是ordinal属性,通过这个序号来将Enum类型字段映射成int类型来存储。
  • 过使用Enum类型实例中的name属性来完成映射,这里讲Enum类型映射成String类型来完成存储。

定义的枚举如下:

代码语言:java
复制
package demo.springboot.cons;

public enum Gender {

    /**
     * 男
     * ordinal是0, name是MALE
     */
    MALE,
    /**
     * 女
     * ordinal是1, name是FEMALE
     */
    FEMAL

}

不使用注解@Enumerated

其实,不使用注解,默认的就是@Enumerated(EnumType.ORDINAL),也就是实体类gender属性改为如下:

代码语言:java
复制
	@Enumerated(EnumType.ORDINAL)
    @Column(name = "gender")
    private Gender gender;

使用@Enumerated(EnumType.STRING)

代码语言:java
复制
    @Enumerated(EnumType.STRING)
    @Column(name = "gender")
    private Gender gender;

注意,一开始我们创建j_test2表的时候,gender属性我们使用的int类型,就是为了第一种方式存储枚举项的ordinal序号,而现在我们要存在的是枚举项的name(MALE,FEMALE),所所以数据库的gender类型要改为varchar类型,如下:

关系映射

JPA还提供了用于描述实体类之间关系的注释,比如@OneToOne@OneToMany@ManyToOne@ManyToMany等。这些注释可以用于建立实体类之间的关联关系,例如一对一、一对多、多对一和多对多关系。

下面是一个使用@OneToOne注释的例子:

代码语言:java
复制
@Entity
public class User {
    @Id
    private Long id;
    
    @OneToOne(mappedBy = "user")
    private Address address;
    
    // 其他属性声明省略...
}

@Entity
public class Address {
    @Id
    private Long id;
    
    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
    
    // 其他属性声明省略...
}

在上面的例子中,User类和Address类之间建立了一对一关系。User类通过address属性引用Address类,Address类通过user属性引用User类。@OneToOne注释用于标识这个关系,@JoinColumn注释用于指定外键列的名称。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • @Entity注释
  • @Id注释
  • @Column注释
  • @Lob
  • @GeneratedValue注释
  • @Transient注释
  • @Enumerated
    • 不使用注解@Enumerated
      • 使用@Enumerated(EnumType.STRING)
      • 关系映射
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档