Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用JpaRepository代替Crudepository_Spring_Jpa - Fatal编程技术网

Spring 使用JpaRepository代替Crudepository

Spring 使用JpaRepository代替Crudepository,spring,jpa,Spring,Jpa,我已经读到,如果可能的话,您应该在JpaRepository上使用crudepository或paging和sortingrepository,这样您就不会将您的代码与特定于商店的实现相耦合,但是是否有任何实例表明JpaRepository会是更好的选择 对于我的应用程序,我们需要使用saveAndFlush()方法和flush()方法立即刷新数据库更改,因为我们正在尝试将两个实体合并在一起,不希望在具有唯一键条件的情况下出错 例如: public class User { @Id

我已经读到,如果可能的话,您应该在
JpaRepository
上使用
crudepository
paging和sortingrepository
,这样您就不会将您的代码与特定于商店的实现相耦合,但是是否有任何实例表明
JpaRepository
会是更好的选择

对于我的应用程序,我们需要使用
saveAndFlush()
方法和
flush()
方法立即刷新数据库更改,因为我们正在尝试将两个实体合并在一起,不希望在具有唯一键条件的情况下出错

例如:

public class User {
    @Id
    String userId;

    @OneToMany(mappedBy = "user")
    private Collection<Address> addresses;

    // getter and setter methods
}

public class Address {

    @ManyToOne(optional = false)
    private  User user;

    // Other fields
    // getter and setter methods
}

public void mergeDuplicateUserAddresses(User user, User duplicateUser) {
    String userId = user.getUserId();
    List<Address> addresses = duplicateUser.getAddresses()

    for (Address address : addresses) {
        address.setUser(userId);
        addressesRepository.saveAndFlush(address);
    }
}
公共类用户{
@身份证
字符串用户标识;
@OneToMany(mappedBy=“用户”)
私人收藏地址;
//getter和setter方法
}
公共课堂演讲{
@多通(可选=假)
私人用户;
//其他领域
//getter和setter方法
}
public void mergeDuplicateUserAddresses(用户用户,用户duplicateUser){
字符串userId=user.getUserId();
列表地址=duplicateUser.getAddresses()
收件人(地址:地址){
地址:setUser(userId);
地址repository.saveAndFlush(地址);
}
}

在这个例子中,我看到了使用
JpaRepository
而不是
crudepository
,但是有没有其他方法可以让它不那么特定于商店呢?

只要使用JpaRepository,并对它感到满意就行了。 底层数据源类型的更改实际上是一种罕见的情况,当它发生时,无论如何都需要进行更大的更改。不同的数据源类型实际上需要不同的处理。 我知道经常会有人说你应该从数据源的类型中抽象出来,这样你就可以很容易地改变它。但不确定他们是否试过

一些争论为什么它不起作用(以防你需要与某人争论)

  • 底层关系数据库的更改通常不起作用。是的,JPA应该是它的一个抽象层,但它并不适用于所有情况。当您更改jpa提供商时,您也会遇到麻烦。它们都有各自的特点
  • 当您将日期源f.e.从relational转换为noe4j时。你用@Query做什么。很抱歉,我不得不这么说,但neo4j不懂sql
  • 事务处理是您必须始终牢记的事情。您的数据源是否支持事务以及它们的行为方式。例如关系和neo4j。两者都有一个事务系统,但它们的工作方式完全不同,当您将代码直接迁移到neo4j时,可能会遇到麻烦。原因是neo4j具有更严格的锁定行为
  • 出于性能原因,您的业务层可能依赖于特定的抓取行为,但如果您交换数据源类型,会发生什么情况呢。这些不同的数据源类型是否支持替代的抓取行为。或者正因为如此,有必要修改业务层的工作方式吗
还有这个故事。数据源类型的更改通常意味着比实现不同的接口更麻烦