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

3

我对spring和hibernate都很陌生,但我看到了这两个注解@Entity@Repository在DAO类中被使用。由于这两个注解都用于DAO类,那么它们的区别是什么?何时使用其中之一?

3个回答

3

@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);
 }

基本的CRUD操作已经由CrudRepository接口提供,因此无需再次实现它们。您可以像这样在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 注释来帮助您 :)


1
谢谢你的解释,这让我对两种注解之间的区别有了基本的了解。 - backdoor

1

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

@Repository注解定义了对表进行CRUD操作。它非常类似于DAO模式,从/到存储中获取和保存实体-它代表了数据库表。


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注释持久层的类,它将充当数据库存储库。@Repository的工作是捕获特定于持久性的异常,并将其重新抛出为Spring的统一未检查异常之一。
总结一下,@Entity是JPA(Java持久化API)规范的一部分,用于映射Java POJO和关系数据库世界中的实体,而@Repository是一个Spring的原型,用于注释POJO bean,它们的工作是数据库操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接