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

2024-07-30 17:09:57 浏览数 (2)

简介

在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注释用于指定外键列的名称。

0 人点赞