以下是关于Spring Data JPA的常用注解的详细介绍及示例说明。
@Entity
@Entity
是一个用于将 Java 类映射到数据库表的注解。该注解必须在实体类上声明,用于指示该类是实体的类,需要创建一个数据库表来映射该实体类。例如:
@Entity
@Table(name = "users")
public class User {
// 实体类的属性和方法...
}
在上面的示例中,@Table
指示数据库表的名称为“users”,则必须在数据库中保证该表存在,否则,JPA在查询和操作数据时将会抛出异常。
@Id
@Id
是用于设置实体类的主键标识符的注解。该注解必须标注在实体类的属性上,并通常用于与主键列进行映射。例如:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private Long id;
// 实体类的其他属性和方法...
}
在上面的示例中,@GeneratedValue
用于指示系统自动分配标识符的值。@Id
与@GeneratedValue
一同使用,将Java类属性映射为数据库主键列。该策略适用于被称为自动递增的数据库主键列。
@Column
@Column
是用于指示实体属性应该映射到数据库表中的列的注解。该注解必须在实体类的属性上指定,用于与数据库表的列进行联接映射。例如:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private Long id;
@Column(name = "name")
private String username;
@Column(nullable = false)
private Integer age;
// 实体类的其他属性和方法...
}
在上面的示例中,@Column
指定了数据库表中name
和age
属性的映射关系:
name
属性映射为数据库表name
列;age
属性映射为数据库表age
列,并将nullable
参数设置为false
,表示该列不允许为null
值。
@OneToMany 和 @ManyToOne
@OneToMany
和 @ManyToOne
是用于建立实体之间关系映射的注解。
@OneToMany
@OneToMany
注解用于建立一对多关系。通常位于多的一方,即拥有外键的实体类上。例如:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "user")
private List<Order> orders;
// 实体类的其他属性和方法...
}
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", referencedColumnName = "id")
private User user;
// 实体类的其他属性和方法...
}
在上面的示例中,@OneToMany
注解指示了用户实体可以有多个订单。mappedBy
属性指定了关系的维护方,即orders属性在order类中代表了用户的一方。
@ManyToOne
@ManyToOne
则用于建立多对一关系。通常位于多的一方的实体类属性上。例如:
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", referencedColumnName = "id")
private User user;
// 实体类的其他属性和方法...
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "user")
private List<Order> orders;
// 实体类的其他属性和方法...
}
在上面的示例中,@ManyToOne
注解指示了订单实体属于一个用户。@JoinColumn
注解用于指定外键列的名称和引用实体类的列的名称。
示例说明
示例1:使用@Entity和@Id注解
首先创建一个实体类 Product
,其中包含 id
和 name
两个属性:
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue
private Long id;
@Column(name = "name")
private String name;
// 省略其他属性和方法...
}
该实体类使用 @Entity
和 @Table
注解指定与数据库表的映射。@Id
和 @GeneratedValue
注解将 id
属性映射到数据库表中的主键列,表示其值由系统自动生成。
示例2:使用@ManyToOne和@OneToMany注解
接下来创建一个包含订单详细信息的实体类 OrderDetail
,其中包含 id
、quantity
、price
和orderId
四个属性,用于表示某个订单中某个商品的数量、单价和总价等信息。@ManyToOne
注解用于将订单详细信息与订单关联,@JoinColumn
注解则用于指示外键列的名称和引用订单的列的名称:
@Entity
@Table(name = "order_details")
public class OrderDetail {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private Integer quantity;
@Column(nullable = false)
private Double price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id", referencedColumnName = "id")
private Order order;
// 省略其他属性和方法...
}
接下来创建一个订单的实体类 Order
,其中包含 id
、orderNumber
和 orderDetails
三个属性。该实体类使用 @OneToMany
注解将订单及其详细信息关联,并指定了关系的维护方是 orderDetails
:
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue
private Long id;
@Column(name = "order_number")
private String orderNumber;
@OneToMany(mappedBy = "order")
private List<OrderDetail> orderDetails;
// 省略其他属性和方法...
}
在上述示例中,@OneToMany
注解指示了订单实体具有多个订单详细信息。 mappedBy
属性指定了关系的维护方,即 orderDetails
属性在 OrderDetail
类中代表了订单的一方。
注意: 示例2是双向关联,所以需要在每个实体类上添加对方的属性,所以 Order
类中有一个名为orderDetails
的 List
属性用于表示订单所包含的详细信息,而 OrderDetail
类中则有一个 order
属性用于表示该详细信息所对应的订单。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringDataJPA在Entity中常用的注解介绍 - Python技术站