JPA之@entity、@Table、@Column、@Id

  • Post author:
  • Post category:其他


在JPA中有一种这种定义,可以将普通的java对象映射到数据库。这种普通对象被称为Entity Bean。

这种entity Bean对象除了有一些注释之外,和普通的java类没有任何区别。

创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。




—@Entity

必须与@Id注解结合使用,否者会No identifier specified for entity:

@Entity 说明这个 class 是实体类,并且使用默认的 orm 规则,即 class 名即数据库表中表名,class 字段名即表中的字段名。@Entity 注解指名这是一个实体 Bean。

例如:

@Entity

public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private Long id;
    private String name;
    private int age;
    private String addree;

}

如果没有 @javax.persistence.Entity 和 @javax.persistence.Id 这两个注解的话,它完全就是一个典型的 POJO 的 Java 类,现在加上这两个注解之后,就可以作为一个实体类与数据库中的表相对应。

**实体类必须用 @javax.persistence.Entity 进行注解;如果不用这个注解会报 Error creating bean with name ‘entityManagerFactory’ defined in class path resource:@OneToOne or @ManyToOne 异常

**必须使用

@javax.persistence.Id 来注解一个主键;如果没有这个注解会报:No identifier specified for entity 异常

**实体类必须

拥有一个 public 或者 protected 的无参构造函数,否则会报错:

No default constructor for entity:


    	@Entity  
            public class UserEntity{...} 表名 user_entity  
        @Entity(name="UE")  
            public class UserEntity{...} 表名 ue  
        @Entity(name="UsEntity")  
            public class UserEntity{...} 表名 us_entity 

-**



-@Table:

**

@Table 注解是一个非必须的注解。@Table 注解指定了 Entity 所要映射带数据库表,其中 @Table.name() 用来指定映射表的表名。声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe),目录 (Catalog) 和 schema 的名字。

如果同时使用了 @Entity(name=“student”) 和 @Table(name=“students”),最终的对应的表名必须是哪个?答案是 students,这说明优先级:@Table > @Entity。



@Id

@Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。

@Id标注也可置于属性的getter方法之前。



@GeneratedValue

@GeneratedValue 用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。

在javax.persistence.GenerationType中定义了以下几种可供选择的策略:

–IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式;

–AUTO: JPA自动选择合适的策略,是默认选项;

–SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式

–TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。

@GeneratedValue注解有两个属性,分别是strategy和generator,

generator:主键生成的来源,既由谁来执行生成主键,从哪里获取主键值。下面会讲到mybatis可以配置的值。



@TableGeneratedor

用途:将当前主键的值单独保存到数据库的一张表里去,主键的值每次都是从该表中查询获得,适用于任何数据库,不必担心兼容问题。

举个栗子:

@Id

@Column(name = "id")

@TableGenerator(name = "hf_opert_id_gen", //此处的名字要和下面绿色标注的对应

table = "mcs_hibernate_seq", //主键保存到数据库的表名

pkColumnName = "sequence_name", //表里用来保存主键名字的字段

valueColumnName = "sequence_next_hi_value",//表里用来保存主键值的字段

pkColumnValue = "user_id", //表里名字字段对应的值

allocationSize = 1)//自动增长,设置为1

@GeneratedValue(strategy = GenerationType.TABLE, generator = "hf_opert_id_gen")

private Integer id;
@TableGenerator(
        name="TableGenerator",           //生成器名称
        table="jdp_keys",          //指定表名
        pkColumnName="KEYID",      //Primary key Column Name 表示在持久化表中,该主键生成策略所对应键值的名称 字符串类型
        valueColumnName="KEYVALUE", //表示在持久化表中,该主键当前所生成的值 整型
        pkColumnValue="REPORT_ACTIVITY_ID",    //主键名称,这里直接用了表名
        allocationSize=1            //每次主键值增加的大小

@TableGenerateor 属性中的 table :

可以利用select * from table名字;

查出数据库中keyID 和 KeyValue(主键个数)的信息。

在这里插入图片描述

以看出 pkColumnName=“KEYID”

pkColumnValue=“马赛克”

valueColumnName=“KEYVALUE”



@Column

name

定义了被标注字段在数据库表中所对应字段的名称;

unique

表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。

nullable

表示该字段是否可以为null值,默认为true。

insertable

表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。

updatable

表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。

columnDefinition(大多数情况,几乎不用)

表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)

table

表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。

length

表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。

precision和scale

precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

1: 指定字段“tradeNo”交易编号的长度为50,且值不能为null

@Column(name = "tradeNo", length = 50, nullable = false)
private String tradeNo;

2:指定字段“totalAmount”交易金额的精度(长度)为10,小数点位数为2位,且值不能为null

@Column(name = "totalAmount", precision = 10, scale = 2, nullable = false)
private BigDecimal totalAmount;

3: 字段“text”,指定建表时SQL语句 如“varchar(50) NOT NULL”

@Column(name = "text", columnDefinition = "varchar(50) not null")
private String text;

4:字段值为只读的,不允许插入和修改。通常用于主键和外键

@Column(name = "id", insertable = false, updatable = false)
private Integer id;

持续更新。。。



版权声明:本文为weixin_45865760原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。