Spring Data JPA CrudRepository
和JpaRepository
接口有什么区别?
当我在网上看到这些例子时,我看到它们在那里可以互换使用.他们之间有什么区别?你为什么要用一个而不是另一个?
我正在使用spring数据,我的DAO看起来像
public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
public findAllOrderByIdAsc(); // I want to use some thing like this
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,注释行显示了我的意图.Spring Data可以提供内置功能,使用这种方法通过ASC/DESC查找某些列的所有记录顺序吗?
Hibernate和Spring Data JPA之间的主要区别是什么?什么时候不应该使用Hibernate或Spring Data JPA?另外,什么时候Spring JDBC模板的性能比Hibernate/Spring Data JPA好?
好吧,这个问题几乎说明了一切.使用JPARepository如何更新实体?
JPARepository只有一个save方法,它不会告诉我它是否实际创建或更新.例如,我将一个简单的Object插入数据库User,它有三个字段:firstname和lastname以及age:
@Entity
public class User {
private String firstname;
private String lastname;
//Setters and getters for age omitted, but they are the same as with firstname and lastname.
private int age;
@Column
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
@Column
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
private long userId;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getUserId(){
return this.userId;
}
public …
Run Code Online (Sandbox Code Playgroud) 在Spring CrudRepository中,我们是否支持字段的"IN子句"?即类似于以下内容?
findByInventoryIds(List<Long> inventoryIdList)
Run Code Online (Sandbox Code Playgroud)
如果没有这样的支持,可以考虑哪些优雅的选择?针对每个id的触发查询可能不是最佳的.
我正在研究Spring Data JPA.考虑下面的示例,我将默认使用所有crud和finder功能,如果我想自定义查找器,那么也可以在界面本身轻松完成.
@Transactional(readOnly = true)
public interface AccountRepository extends JpaRepository<Account, Long> {
@Query("<JPQ statement here>")
List<Account> findByCustomer(Customer customer);
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何为上述AccountRepository添加一个完整的自定义方法及其实现?由于它的接口我无法在那里实现该方法.
我对Spring Data-JPA和JPA之间的区别感到有点困惑.我知道JPA它是使用流行的ORM技术将Java对象持久化到关系数据库的规范,即换句话说,JPA提供接口和其他ORM技术,实现称为JPA提供程序的接口,例如Hibernate.
现在究竟是什么Spring Data JPA.Spring Data JPA是否在JPA上增加了一些功能(接口),仍然只是指定它还是JPA提供者?
我看到Spring Data JPA围绕存储库工作(DAO层:如果我没有错).所以我的意思是使用'Spring Data JPA + Hibernate'或仅使用'Hibernate'指导它是如何不同的?
我有一个用例,它调用以下内容:
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public UserControl getUserControlById(Integer id){
return this.userControlRepository.getOne(id);
}
Run Code Online (Sandbox Code Playgroud)
观察@Transactional
has Propagation.REQUIRES_NEW,存储库使用getOne.当我运行该应用程序时,收到以下错误消息:
Exception in thread "main" org.hibernate.LazyInitializationException:
could not initialize proxy - no Session
...
Run Code Online (Sandbox Code Playgroud)
但是,如果我改变getOne(id)
的findOne(id)
一切工作正常.
顺便说一下,就在用例调用getUserControlById方法之前,它已经调用了insertUserControl方法
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public UserControl insertUserControl(UserControl userControl) {
return this.userControlRepository.save(userControl);
}
Run Code Online (Sandbox Code Playgroud)
两种方法都是Propagation.REQUIRES_NEW,因为我正在进行简单的审计控制.
我使用该getOne
方法,因为它是在JpaRepository接口中定义的,我的Repository接口从那里扩展,我当然正在使用JPA.
该JpaRepository接口扩展自CrudRepository.该findOne(id)
方法定义于CrudRepository
.
我的问题是:
getOne(id)
方法?getOne(id)
方法?我正在使用其他存储库并且所有使用该getOne(id)
方法并且所有工作正常,只有当我使用Propagation.REQUIRES_NEW …
我很难决定是否应该坚持使用Hibernate来完成一个新项目,或者尝试使用JPA和新的Spring Data实现.
Spring Data框架是针对具有适度查询要求的大型项目还是小型项目?
虽然我通过使用@Query
注释确实看到了减少代码的优势,但您对动态查询有何看法?当你想要实现一个非常复杂的save()方法时呢?
文档说明要创建主存储库实现的自定义接口和实现,但是如果需要访问crud存储库本身的任何超级方法呢?crud存储库实现了自定义存储库 - 而不是相反.这似乎是一个奇怪的设计.
我很不确定这个框架是否能够应对复杂和大型应用程序的挑战.我从未遇到过Hibernate的许多问题,而且我正在考虑坚持使用旧的可靠而不是使用Spring Data JPA.
我该怎么办?如果我使用Spring Data JPA,我会遇到哪些无法预料的并发症和成本?
我正在使用Spring JPA来执行所有数据库操作.但是我不知道如何从Spring JPA中的表中选择特定的列?
例如:
SELECT projectId, projectName FROM projects