简介
在Java中,javax.persistence
是Java Persistence API
(JPA)的一部分,它提供了一种机制来管理Java应用程序中的对象持久化。其中,属性注释是一种用于描述实体类中属性的注释,它可以帮助开发人员更好地理解和配置实体类的属性
@Entity注释
在JPA中,@Entity
注释用于标识一个类作为一个实体类。一个实体类对应数据库中的一张表。下面是一个使用@Entity
注释的例子:
@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
注释的例子:
@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
注释的例子:
@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
注释用于指定外键列的名称。