JPA实体类中的注解

@Entity

  标注于实体类上,通常和@Table是结合使用的,代表是该类是实体类
@Table

  标注于实体类上,表示该类映射到数据库中的表,没有指定名称的话就表示与数据库中表名为该类的简单类名的表名相对应,如果是逆向生成表的话就会以简单类名作为表名

  如果指定名称,例如@Table(name="tb_user"),就表示映射到数据库中的tb_userz这个表;
@Id

  标注于属性上,通常是在get方法上,也可以在属性的声明上。

  用于表示该属性作为ID主键
@GeneratedValue

  主键生成策略,@GeneratedValue(strategy=GenerationType.AUTO)表示主键自增长由实现jpa的框架来控制,例如我们用hibernate实现的就是有hibernate来控制

  GenerationType总共有四个:

  AUTO:

  TABLE:由一个表来维护主键,这个表记录上一次生成的主键,然后+1给作为新的主键,这种方式效率比较低
  SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列
  IDENTITY:主键增长有数据来维护,可能不同数据库有不同的策略

@Column

  标注于属性上,有很多功能,例如指定长度、是否为空,列名以及对应到数据库汇中的类型等,如@Column(length,nullable,name)

  例如,我们string对应到数据库中的text就可以这样写,@Column(columnDefinition="text")

@Temporal

  指定时间类型,例如,@Temporal(TemporalType.Date)
@Enumerated(EmumType.STRING) 注解指定枚举类型

  其中,EmumTypes表示保存到数据库中是索引还是字符串

@Lob声明属性对应的数据库字段为大文本类型,可以存放大的数据(文本和字节)
@Transient不成为持久化字段及不跟数据库中的字段形成映射
@Basic(fetch=FetchType.LAZY)

  是否把数据装载到内存中延迟初始化,第一次访问的时候在加载数据,一般用在大数据存放
@Embeddable指定联合组键 和@EmbeddedId结合使用

===================================================================

以上是针对实体的注解,接下来时针对实体与实体之间关联的注解:

一对多
一般是在多的一般维护关系,也就是多的一方作为关系维护端,负责维护外键,而一的一方是不能操作外键的;
@oneToMany(cascade={CascadeType.*},fetch=FetchType.*,mappedBy="") 
默认的FetchType.Lazy
mappedBy就是指关系被维护端;
多对一
@ManyToOne(cascade.CascadeType.*,optional=true|false)
@JoinColum(name="")--》维护关系(外键)
一般定义级联保存、级联查询
默认为立即加载!
optional可选?也就是是否必须存在,false就是不允许为空。

一对一
@OneToOne(mapperBy="",cascade={CascadeType.*})
随便一端都可以作为关系维护端
通过mapperBy指定为被维护端
fetch默认为立即加载
外键则在关系维护端定义

多对多
确定维护关系,都是通过中间表,这样两端就都是与中间表形成一对多!
关系被维护端:
@ManyToMany(cascade={CascadeType.*},mapperBy="itself")
关系维护端
@ManyToMany(cascade={CascadeType.*})
@JoinTable(name="",[email protected](name=""),[email protected](name=""))
其中,inverseJoinColums只关系被维护端的外键
joinColum指关系维护端本身的外键
总结
关系被维护端用mapperBy来定义关系
关系维护端用joinColum来指定外键名称,维护外键或者是@JoinTable通过中间表维护关系

*ToOne 默认加载为立即加载
*ToMany 默认加载方式为懒加载

  1. @Entity 
    @Entity标记在类名上面,作为实体类的标识
  2. @Table 
    当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。 
    @Table 标注的常用选项是 name,用于指明数据库的表名 
    @Table标注还有一个两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名。uniqueConstraints选项用于设置约束条件,通常不须设置。
  3. @Id 
    @Id设置对象表示符,标识的实体类的属性映射对应表中的主键
  4. @GeneratedValue 
    设置标识符的生成策略,常与@Id一起使用 
    参数:strategy指定具体的生成策略 
    方式一:@GeneratedValue(strategy=GenerationType.AUTO) 也是默认策略, 即写成@GeneratedValue也可; 
    类似于hibernate的native策略,生成方式取决于底层的数据库。 
    方式二:@GeneratedValue(strategy = GenerationType.IDENTITY)指定“自动增长”策略,适用于MySQL; 
    方式三:@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “seq_tbl_person”)指定“序列”策略,常用于Oracle,其中generator表示生成器的名字。而且还要指定@SequenceGenerator(name = “seq_tbl_person”, sequenceName = “seq_tbl_person”, allocationSize = 1)注解配合使用 
    其中name指定生成器的名字(与generator的值一样),sequenceName指定数据库中定义序列的名字,allocationSize指定序列每次增长1
  5. @Column 
    描述数据库表中该字段的定义,具有一下属性 
    name:表示数据库表中该字段的名称,默认情形属性名称一致。 
    nullable:表示该字段是否允许为null,默认为true。 
    unique:表示该字段是否是唯一标识,默认为false。 
    length:表示该字段的大小,仅对String类型的字段有效。 
    insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true。 
    updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。 
    columnDefinition:表示该字段在数据库中的实际类型。通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP。此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用。
  6. @OrderBy 
    在加载数据的时候可以为其指定顺序。
  7. @Transient 
    表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。 
    如果一个属性并非数据库表的字段映射。就务必将其标示为@Transient。否则。ORM框架默认其注解为@Basic
  8. @OneToOne 
    描述一个一对一的关联 
    可选 
    fetch:表示抓取策略,默认为FetchType.LAZY 
    cascade:表示级联操作策略
  9. @ManyToOne 
    表示一个多对一的映射,该注解标注的属性通常是数据库表的外键 
    optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true 
    可选 
    fetch:表示抓取策略,默认为FetchType.EAGER 
    cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作 
    targetEntity:表示该属性关联的实体类型。该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity。
  10. @OneToMany 
    描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段。 
    fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存 
    可选 
    cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除 
    例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除
  11. @ManyToMany 
    描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理 
    可选 
    targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class 
    mappedBy:表示多对多关联的另一个实体类的对应集合属性名称 
    两个实体间相互关联的属性必须标记为@ManyToMany,并相互指定targetEntity属性, 
    需要注意的是,有且只有一个实体的@ManyToMany注解需要指定mappedBy属性,指向targetEntity的集合属性名称 
    利用ORM工具自动生成的表除了User和Book表外,还自动生成了一个User_Book表,用于实现多对多关联
  12. @JoinColumn 
    可选 
    @JoinColumn和@Column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个@ManyToOne的字段. 
    name:该字段的名称.由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定. 
    例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键, 
    其默认的名称为实体User的名称+下划线+实体User的主键名称 
    @JoinTable(name = “student_teacher”, inverseJoinColumns = @JoinColumn(name = “tid”), joinColumns = @JoinColumn(name = “sid”)) 
    可选 
    由第三张表来维护两张表的关系 
    name:是关系表的名字 
    joinColumns:自己这一端的主键 
    inverseJoinColumns:对方的主键
  13. @MappedSuperclass 
    可选 
    @MappedSuperclass可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解
  14. @Embedded 
    @Embedded将几个字段组合成一个类,并作为整个Entity的一个属性. 
    例如User包括id,name,city,street,zip属性. 
    我们希望city,street,zip属性映射为Address对象.这样,User对象将具有id,name和address这三个属性. 
    Address对象必须定义为@Embededable

原文地址:https://www.cnblogs.com/jiangwz/p/8478301.html

时间: 2024-11-06 03:53:43

JPA实体类中的注解的相关文章

Hibernate在实体类中对于时间的注解

在时间类型DATE 属性上添加一个 @Temporal(TemporalType.DATE)(精确到年月日)@Temporal(TemporalType.TIME)(精确到时分秒)@Temporal(TemporalType.TIMESTAMP)(默认年月日时分秒)示例: @Temporal(TemporalType.DATE)private Date updateDate; 有了这个就不需要用java代码将时间戳,转换成需要的日期格式.直接在实体类中进行注解!

数据库中信息存放到 实体类中

把数据库中信息存放到 实体类中,实体类设置值 Tb_pay tb_pay = payDAO.find(userid,Integer.parseInt(strno)); txtMoney.setText(String.valueOf(tb_pay.getMoney()));// 显示金额 txtTime.setText(tb_pay.getTime());// 显示时间 spType.setSelection(tb_pay.getType()-1);// 显示类别 txtHA.setText(tb

struct框架中实体类中属性的类型错误问题

在struct框架中,我们会写出实体类然后再sqlmap中进行映射,通常我们都知道 java中date类型有java.sql.date 和 java.util.date 经过细心发现,将对象生成为json对象时,json类会将date类型转换成java.util.date 如果在实体类中写成java.sql.date,就会抛出异常 下面我就来传个图 这里仅仅只需要把实体中date类型导入的包改成util的便不会出错 有人说util的包更常用,其实sql包中的直接输入就和我们平时写的时间的差不多,

MyBatis系列二 之 数据库列名于程序实体类中字段名称不一致

MyBatis系列二  之   数据库列名于程序实体类中字段名称不一致 情景:当数据库中的列名与我们程序实体类中的字段名称不一致         使用ResultMap节点配置信息  在映射文件中  mapper根节点下配置ResultMap节点信息 <resultMap type="Student" id="studentMapper"> <result column="sname" property="stunam

使用sqlServer数据库,实体类中的配置问题

1.使用sqlServer数据库,实体类中的xml的配置问题(目前还没有去试试使用mysql的时候是否也是这样的写法) 1.1 在实体类的xml中调用自己在数据库中写的函数 对应的数据库中的函数,函数中的问好代表的是传入的参数

利用反射将IDataReader读取到实体类中效率低下的解决办法

原文:利用反射将IDataReader读取到实体类中效率低下的解决办法 最开始使用反射一个类型的各个属性,对气进行赋值的代码如下: public static List<T> ToList<T>(IDataReader reader) { //实例化一个List<>泛型集合 List<T> DataList = new List<T>(); PropertyInfo[] properties = typeof(T).GetProperties()

在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句:

如果是String类型的字符串进行判空的时候: <if test="inspectOrg != null and inspectOrg != ''"> INSPECT_ORG = #{inspectOrg} </if> 但是如果是实体类中的Integer类型,就是去掉空字符串的判断: <if test="inspectTaio != null"> AND INSPECT_TAIO = #{inspectTaio} </if&

Spring整合JPA时,为实体类添加@Entity注解时提示The type MultipartEntity is deprecated

这个情况是由于导入错了Entity包所导致的. 按住Alt+T时,会有两个关于@Entity的提示 org.hibernate.annotations.Entity 和 javax.persistence.Entity,我们应该使用javax.persistence.Entity.此时就不会出现过时的提示. @org.hibernate.annotations.Entity 和 @javax.persistence.Entity 的区别: JPA的Entity类和Hibernate的Entity

JPA实体类与应用不在一个包导致错误:java.lang.IllegalArgumentException: Not a managed type: class AAA

参考文章: springboot:与JPA结合出现异常Caused by: java.lang.IllegalArgumentException: Not a managed type: class xxx - Victory9477的博客 - CSDN博客 ---------------------------------- 1.SpringBoot默认的扫描方式是扫描启动类所在包的实体类,所以如果实体类和应用在同一个保内没有问题. 2.如果两者不在一个包内则会出现标题中的错误,此时就需要在启