我在春季和休眠中是新手,我得到了用于DAO类的这两个注释@Entity
和@Repository
。由于两个注释都用于DAO类。然后,有什么区别以及何时使用它们之一。
答案 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,而不是它们的工作是数据库操作