我对spring和hibernate都很陌生,但我看到了这两个注解@Entity
和@Repository
在DAO类中被使用。由于这两个注解都用于DAO类,那么它们的区别是什么?何时使用其中之一?
我对spring和hibernate都很陌生,但我看到了这两个注解@Entity
和@Repository
在DAO类中被使用。由于这两个注解都用于DAO类,那么它们的区别是什么?何时使用其中之一?
@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);
其中find和Student返回类型告诉 Hibernate 它必须寻找一个名为 Student 的对象,byName 告诉它必须查询数据库以查找特定姓名的学生。(关键字 Name 实际上是实体属性,使用大写字母!)
当然,如果您需要更复杂的查询,也可以使用 @Query 注释来帮助您 :)
@Entity注解定义了一个类可以被映射到一个表,它只是一个标记,就像Serializable接口一样。实体是表示数据库中的一行(通常)的对象。
@Repository注解定义了对表进行CRUD操作。它非常类似于DAO模式,从/到存储中获取和保存实体-它代表了数据库表。
@Entity
假设我们有一个称为Student的POJO,它表示学生的数据,并且我们希望将其存储在数据库中。
public class Student {
// fields, getters and setters
}
@Entity
public class Student {
// fields, getters and setters
}