spring @Entity @Table

本文介绍如何使用Java持久化API (JPA) 创建单表映射的实体Bean。文章详细解释了@Entity、@Table、@Id 和 @Column 等注解的作用,并提供了示例代码。此外还介绍了主键生成策略及@Column注解的多个属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单表映射的实体Bean

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "tbl_user" schema="SIMULATE" )
publicclass User implements Serializable {

	private static final long serialVersionUID = 1L;
		
    @Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id" insertable=false,nullable=false,updatable=false)	
	private Integer id;

    @Column(name = "name") 
	private String name;

    @Column(name = "age") 
	private String age;

    public Integer getId() {
        return this.id;
    }
	
    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

	/****
	 * 用户名
	 * @param name
	 */
    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public User() {}

}

从上面代码来看开发实体Bean非常简单,比起普通的JavaBean就是多了些注释。

@Entity注释指名这是一个实体Bean,

@Table注释指定了Entity所要映射带数据库表,

其中@Table.name()用来指定映射表的表名。如果缺省@Table注释,系统默认采用类名作为映射表的表名。

实体Bean的每个实例代表数据表中的一行数据,行中的一列对应实例中的一个属性。

@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下:

1)name:映射的列名。如:映射tbl_user表的name列,可以在name属性的上面或getName方法上面加入;

2)unique:是否唯一;

3)nullable:是否允许为空;

4)length:对于字符型列,length属性指定列的最大字符长度;

5)insertable:是否允许插入;

6)updatetable:是否允许更新;

7)columnDefinition:定义建表时创建此列的DDL;

8)secondaryTable:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字。

@Id注释指定表的主键,它可以有多种生成方式:

1)TABLE:容器指定用底层的数据表确保唯一;

2)SEQUENCE:使用数据库德SEQUENCE列莱保证唯一(Oracle数据库通过序列来生成唯一ID);

3)IDENTITY:使用数据库的IDENTITY列莱保证唯一;

4)AUTO:由容器挑选一个合适的方式来保证唯一;

5)NONE:容器不负责主键的生成,由程序来完成。

@GeneratedValue注释定义了标识字段生成方式。

@Temporal注释用来指定java.util.Date或java.util.Calender属性与数据库类型date、time或timestamp中的那一种类型进行映射。

@Temporal(value=TemporalType.TIME)

private Date birthday;

//oracle数据库自定义的sequences
@SequenceGenerator(name = "MY_SEQUENCE", sequenceName = "INCREMENTA")
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="MY_SEQUENCE")
@Column(insertable=false,nullable=false,updatable=false)
private String id;


<think>我们正在讨论的是Java持久化中的注解@Entity@Table,它们属于JPA规范的一部分。根据引用内容,我们可以总结如下: ### @Entity 注解 - **作用**:标记一个Java类为持久化实体类,表示该类与数据库中的表有映射关系。 - **默认规则**: - 类名默认映射为表名(注意区分大小写,通常数据库表名不区分大小写或为小写)。 - 类中的属性(字段)默认映射为表中的列(列名与属性名相同)。 - **使用位置**:类级别。 - **示例**: ```java @Entity public class User { @Id private Long id; private String name; // 其他属性和方法 } ``` 上述代码中,`User`类将映射到数据库表名为`user`(具体表名可能根据数据库配置有所不同,但通常是类名的小写形式)。 ### @Table 注解 - **作用**:提供更详细的表映射配置,用于覆盖@Entity注解的默认表映射规则。 - **常用属性**: - `name`:指定数据库表名(如果省略,则使用实体类名作为表名)。 - `schema`:指定数据库schema(例如,在PostgreSQL中,schema用于组织数据库对象)。 - `catalog`:指定数据库目录(通常用于MySQL等数据库)。 - 其他属性如`uniqueConstraints`用于定义唯一约束。 - **使用位置**:类级别,与@Entity注解一起使用。 - **示例**: ```java @Entity @Table(name = "users", schema = "public") public class User { // 字段定义 } ``` 上述代码将实体类`User`映射到`public`模式下的`users`表。 ### 区别与联系 | 特性 | @Entity | @Table | |--------------|----------------------------------|-----------------------------------------| | **主要作用** | 声明类为持久化实体 | 自定义实体对应的表信息(覆盖默认映射) | | **是否必需** | 是(每个实体类必须使用) | 可选(仅在需要覆盖默认表映射时使用) | | **默认行为** | 使用类名作为表名(小写形式常见) | 若不指定,则沿用@Entity的默认表名 | | **配置属性** | 无直接配置属性 | 支持name, schema, catalog等属性 | ### 结合使用场景 1. **简单映射**:如果表名与类名相同(忽略大小写),则只需使用`@Entity`。 2. **自定义表名**:当表名与类名不同时,使用`@Table(name="自定义表名")`。 3. **多schema支持**:在需要指定schema的数据库中(如PostgreSQL),使用`@Table(schema="schema_name")`。 4. **多catalog支持**:在需要指定catalog的数据库中(如MySQL),使用`@Table(catalog="catalog_name")`。 ### 注意事项 - **表名大小写问题**:不同数据库对表名大小写的处理不同。例如,在MySQL中,表名默认不区分大小写,而在PostgreSQL中,表名默认小写,但使用双引号可以创建大小写敏感的表名。因此,建议在`@Table`的`name`属性中统一使用小写表名以避免问题。 - **schema和catalog的影响**:根据引用[5],某些数据库驱动(如MySQL 5.0)可能对`schema`和`catalog`的支持有差异。例如,在MySQL中,`catalog`通常对应数据库名,而`schema`可能不被支持或等同于数据库名。因此,使用时应根据具体数据库调整。 - **与@Column注解的配合**:除了表级别的映射,还可以使用`@Column`注解在属性级别定制列映射(如列名、是否可为空等)。 ### 示例代码 ```java import javax.persistence.*; @Entity @Table(name = "t_user", schema = "app_schema") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "user_name", nullable = false, length = 50) private String name; // 使用默认列映射(列名=属性名) private String email; @Transient // 该字段不持久化到数据库 private String temporaryCode; // 构造方法、getter和setter省略 } ``` - 此实体类将映射到数据库表`app_schema.t_user`。 - `name`属性映射到列`user_name`,且非空,最大长度为50。 - `email`属性使用默认列名`email`。 - `temporaryCode`属性被`@Transient`标注,不会出现在数据库表中。 ### 最佳实践 1. **明确指定表名**:即使表名与类名相同,也建议使用`@Table(name="表名")`显式声明,提高代码可读性。 2. **统一命名规范**:建议数据库表名和列名使用小写蛇形命名(如`user_profile`)。 3. **避免使用保留字**:确保自定义的表名和列名不是数据库的保留关键字。 4. **合理使用schema**:在大型应用中,使用schema进行逻辑分组(如`app_schema`、`report_schema`)。 ### 常见问题 **Q: 同时使用@Entity(name="xxx")和@Table(name="yyy")时,表名以哪个为准?** A: 以`@Table(name="yyy")`为准。因为`@Table`注解的优先级高于`@Entity`的`name`属性。`@Entity`的`name`属性主要用于JPQL查询中引用实体(如`SELECT u FROM xxx u`),而实际表名由`@Table`的`name`属性决定。 **Q: 如何忽略某个属性,使其不映射到数据库?** A: 使用`@Transient`注解标记该属性,如上述示例中的`temporaryCode`。 **Q: 在Spring Boot中,如何自动生成表结构?** A: 在`application.properties`中配置`spring.jpa.hibernate.ddl-auto=update`,Hibernate会在应用启动时根据实体类自动创建或更新表结构。 ### 总结 - `@Entity`是定义实体类的必备注解,用于建立Java类与数据库表的关联。 - `@Table`是可选注解,用于细化表映射配置(如表名、schema等)。 - 两者通常一起使用,以实现更灵活的ORM映射。 §§相关问题§§ 1. JPA中@Column注解的详细用法有哪些? 2. 如何在JPA中实现实体类继承的映射策略? 3. Spring Data JPA如何自动生成数据库表结构? 4. JPA实体类中@Id注解的生成策略有哪些区别?</think>### Java中@Entity@Table注解的区别与联系 #### 一、核心区别 | 特性 | @Entity | @Table | |--------------|----------------------------------|---------------------------------------| | **主要作用** | 声明类为持久化实体 | 自定义实体对应的表信息 | | **是否必需** | 是(每个实体类必须使用) | 可选(仅需覆盖默认表映射时使用) | | **默认行为** | 类名=表名,属性名=列名 | 不指定时沿用@Entity的默认表名 | | **配置属性** | 无直接配置属性 | 支持name/schema/catalog等属性 | | **使用位置** | 类级别 | 类级别(与@Entity配合使用) | #### 二、详细解析 1. **@Entity 核心功能** - 标记类为JPA实体,启用ORM映射 - **默认映射规则**: ```java @Entity // 默认映射到表名为 "book" 的表 public class Book { ... } ``` - 必须配合`@Id`定义主键[^2][^4] 2. **@Table 高级配置** - 覆盖默认表映射规则: ```java @Entity @Table(name = "t_books", schema = "inventory") // 自定义表名和schema public class Book { ... } ``` - 主要属性: - `name`:自定义表名(**最常用**) - `schema`:数据库schema(部分数据库如PostgreSQL有效) - `catalog`:数据库目录(MySQL等有效) - `uniqueConstraints`:定义唯一约束 3. **组合使用场景** ```java @Entity // 声明为实体 @Table(name = "users") // 映射到users表而非类名User public class User { @Id // 必须定义主键 @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "user_name") // 列名映射 private String username; } ``` #### 三、使用注意事项 1. **表名大小写问题** - 默认表名可能因数据库转为小写(如MySQL) - 强制保留大小写: ```java @Table(name = "\"UserTable\"") // 使用双引号包裹 ``` 2. **schema的有效性** - 根据引用[5],MySQL 5.x驱动可能忽略`schema`属性 - PostgreSQL等schema-aware数据库可正常使用 3. **与@Column的配合** - `@Table`控制表级属性 - `@Column`控制列级属性: ```java @Column(name = "email", nullable = false, length = 100) private String email; ``` #### 四、最佳实践 1. **推荐总是显式指定表名** ```java // 避免依赖默认映射(类名可能改变) @Entity @Table(name = "customer") public class Client { ... } ``` 2. **多环境适配方案** ```java @Table(name = "orders_${env}") // 配合Spring Profile public class Order { ... } ``` 3. **继承场景下的注解策略** ```java @Entity @Table(name = "payments") @Inheritance(strategy = InheritanceType.JOINED) public abstract class Payment { ... } ``` #### 五、常见错误 1. **遗漏@Id注解** ```java @Entity public class Product { // 错误:未定义@Id private Long serial; } ``` 2. **重复注解冲突** ```java @Entity(name = "emp_table") @Table(name = "employees") // 最终表名=employees public class Employee { ... } ``` > **关键结论**: > `@Entity`是实体类的**身份标识**,`@Table`是表映射的**调优工具**。 > 实际开发中应组合使用:`@Entity`定义实体基础 + `@Table`定制表细节 + `@Column`微调字段[^3][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值