@Entity和@Repository批注有什么区别?

时间:2020-01-27 16:04:22

标签: java spring hibernate spring-boot jpa

我在春季和休眠中是新手,我得到了用于DAO类的这两个注释@Entity@Repository。由于两个注释都用于DAO类。然后,有什么区别以及何时使用它们之一。

3 个答案:

答案 0 :(得分: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会照看这样的方法名称:{strong> find 和 Student 返回类型public Student findByName(String name);告诉hibernate它必须寻找一个学生, byName < / strong>将告诉它必须在数据库中查询具有特定名称的Student。 (名称关键字实际上是带有大写字母的实体属性!)

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

答案 1 :(得分:1)

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

@Repository批注定义对表的CRUD操作。 这很像DAO模式,可以从存储中获取和保存实体-它代表db表。

答案 2 :(得分:0)

@Entity

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

public class Student {

    // fields, getters and setters

}

为此,我们应该定义一个实体,以便JPA知道它。

因此,让我们通过使用@Entity批注进行定义。我们必须在类级别指定此批注。

@Entity
public class Student {

    // fields, getters and setters

}

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

而且,在每一层中,我们都有各种bean。简而言之,Spring使用类路径扫描注释来自动检测它们。

@存储库

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

总结 @Entity JPA 的一部分,Java Persistence API规范用于在关系数据库世界中的Java POJO和实体与 @Repository < / strong>是一种Spring原型,用于注释POJO bean,而不是它们的工作是数据库操作