本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
最近看了很多文章都说,@Entity 和 @Table 注解是 Hibernate 中的注解,甚至一些文章的标题都直接这样写。我都不知道他们这样误导了多少人,今天我就来给大家纠正一下!
@Entity 注解和 @Table 注解都是 Java Persistence API 中定义的一种注解。你说它是 jpa、hibernate、Spring 等中的注解都不太准确。@Entity 和 @Table 注解都必须遵循 Java Persistence API 中定义的一种查询语言(JPQL)。
@Entity 和 @Table 是 JDK1.5 以后支持的元数据注解(Annotation)。
@Entity 注解源码如下:
package javax.persistence; @java.lang.annotation.Documented @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Entity { java.lang.String name() default ""; }
@Table 注解源码如下:
package javax.persistence; @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Table { java.lang.String name() default ""; java.lang.String catalog() default ""; java.lang.String schema() default ""; javax.persistence.UniqueConstraint[] uniqueConstraints() default {}; javax.persistence.Index[] indexes() default {}; }
@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; // Getters and Setters }
如果没有 @javax.persistence.Entity 和 @javax.persistence.Id 这两个注解的话,它完全就是一个典型的 POJO 的 Java 类,现在加上这两个注解之后,就可以作为一个实体类与数据库中的表相对应。他在数据库中的对应的表为:
对应的映射规则为:
-
实体类必须用 @javax.persistence.Entity 进行注解;如果不用这个注解会报 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne 异常
-
必须使用 @javax.persistence.Id 来注解一个主键;如果没有这个注解会报:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity 异常
-
实体类必须拥有一个 public 或者 protected 的无参构造函数,之外实体类还可以拥有其他的构造函数;如果没有无参构造函数会报 org.springframework.orm.jpa.JpaSystemException: No default constructor for entity: : com.xttblog.entity.XttblogTest; nested exception is org.hibernate.InstantiationException: No default constructor for entity: : com.xttblog.entity.XttblogTest 异常
-
实体类必须是一个顶级类(top-level class)。一个枚举(enum)或者一个接口(interface)不能被注解为一个实体;
-
实体类不能是 final 类型的,也不能有 final 类型的方法;
-
如果实体类的一个实例需要用传值的方式调用(例如,远程调用),则这个实体类必须实现(implements)java.io.Serializable 接口。
@Table 注解是一个非必须的注解。@Table 注解指定了 Entity 所要映射带数据库表,其中 @Table.name() 用来指定映射表的表名。声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe),目录 (Catalog) 和 schema 的名字。
如果同时使用了 @Entity(name="student") 和 @Table(name="students"),最终的对应的表名必须是哪个?答案是 students,这说明优先级:@Table > @Entity。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 详解 @Entity 和 @Table 注解的用法