【问题标题】:What is the difference between @Entity and @Repository annotations?@Entity 和 @Repository 注解有什么区别?
【发布时间】:2020-01-27 16:04:22
【问题描述】:

我是 spring 和 hibernate 的新手,我得到了用于 DAO 类的 @Entity@Repository 这两个注释。因为这两个注释都用于 DAO 类。那么,有什么区别以及何时使用其中之一。

【问题讨论】:

    标签: java spring hibernate spring-boot jpa


    【解决方案1】:

    @Entity 类是模型,@Repository 是帮助您从数据库中提取数据的层。例如:

    @Entity
    public class Student {
       @Id
       @GeneratedValue(strategy=GenerationType.IDENTITY) 
       private Long id;
    
       @Column(unique=true)
       private String name;
    
       //getters - setters
    
    }
    

    还有存储库:

     @Repository
     public interface StudentRepository extends CrudRepository<Student,Long> {
      public Student findByName(String name);
     }
    

    CrudRepository 接口已经提供了基本的 CRUD 操作,因此无需再次实现它们。您可以像这样在 Service 类中使用它们:

     @Service
     public class StudentServiceImpl implements StudentService {
        @Autowired
        public StudentRepository studentRepository;
    
        @Override
        public List<Student> findAll()
        {
          return studentRepository.findAll():
        }
    
        @Override
        public Student findByName(String name)
        {
          return studentRepository.findByName(name);
        }
     }
    

    如果您想进行自定义查询,例如通过姓名获取学生,jpa hibernate 非常聪明,可以帮助您仅在 @Repository 注释接口中定义方法,并且不需要任何实现。 但是如果你想让它起作用,这里有一条规则。 Hibernate 将像这样处理方法名称:public Student findByName(String name); findStudent 返回类型告诉 Hibernate 它必须寻找一个 Student,byName 将告诉它必须在数据库中查询具有特定名称的学生。 (Name关键字其实就是实体属性大写!)

    当然,如果您需要一些更复杂的查询,@Query 注释可以帮助您:)。

    【讨论】:

    • 感谢您的澄清。它让我对这两种注释之间的区别有了基本的了解。
    【解决方案2】:

    @Entity 注解定义了一个类可以映射到一个表,它只是一个标记,例如 Serializable 接口。 实体是代表(通常)数据库中的一行的对象。

    @Repository 注解定义了对表的 CRUD 操作。 从存储中获取和保存实体非常类似于 DAO 模式——它代表 db 表。

    【讨论】:

      【解决方案3】:

      @Entity

      假设我们有一个名为 Student 的 POJO,它表示学生的数据,我们希望将其存储在数据库中。

      public class Student {
      
          // fields, getters and setters
      
      }
      

      为了做到这一点,我们应该定义一个实体以便 JPA 知道它。

      所以让我们通过使用@Entity 注释来定义它。我们必须在类级别指定这个注解。

      @Entity
      public class Student {
      
          // fields, getters and setters
      
      }
      

      在大多数典型应用程序中,我们有不同的层,例如数据访问、表示、服务、业务等。

      而且,在每一层中,我们都有不同的 bean。简单地说,为了自动检测它们,Spring 使用类路径扫描注解。

      @Repository

      @Repository 在持久层注释类,它将充当数据库存储库。 @Repository 的工作是捕获特定于持久性的异常并将它们作为 Spring 统一的未检查异常之一重新抛出。

      总结 @EntityJPA Java Persistence API 规范的一部分,用于 Java POJO 和关系数据库世界中的实体之间的映射以及 @Repository 是用于注释 POJO bean 的 Spring 原型,而不是它们的工作是数据库操作操作

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 2019-01-25
        • 2011-10-13
        • 1970-01-01
        • 2014-02-28
        • 2014-02-04
        • 2014-12-29
        • 1970-01-01
        相关资源
        最近更新 更多