【发布时间】:2020-01-27 16:04:22
【问题描述】:
我是 spring 和 hibernate 的新手,我得到了用于 DAO 类的 @Entity 和 @Repository 这两个注释。因为这两个注释都用于 DAO 类。那么,有什么区别以及何时使用其中之一。
【问题讨论】:
标签: java spring hibernate spring-boot jpa
我是 spring 和 hibernate 的新手,我得到了用于 DAO 类的 @Entity 和 @Repository 这两个注释。因为这两个注释都用于 DAO 类。那么,有什么区别以及何时使用其中之一。
【问题讨论】:
标签: java spring hibernate spring-boot jpa
@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); find 和 Student 返回类型告诉 Hibernate 它必须寻找一个 Student,byName 将告诉它必须在数据库中查询具有特定名称的学生。 (Name关键字其实就是实体属性大写!)
当然,如果您需要一些更复杂的查询,@Query 注释可以帮助您:)。
【讨论】:
@Entity 注解定义了一个类可以映射到一个表,它只是一个标记,例如 Serializable 接口。 实体是代表(通常)数据库中的一行的对象。
@Repository 注解定义了对表的 CRUD 操作。 从存储中获取和保存实体非常类似于 DAO 模式——它代表 db 表。
【讨论】:
@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 Persistence API 规范的一部分,用于 Java POJO 和关系数据库世界中的实体之间的映射以及 @Repository 是用于注释 POJO bean 的 Spring 原型,而不是它们的工作是数据库操作操作
【讨论】: