Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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
Java @OneToMany JPA注释会导致不必要的sql更新,并且不会级联_Java_Spring_Hibernate_Jpa_Cascade - Fatal编程技术网

Java @OneToMany JPA注释会导致不必要的sql更新,并且不会级联

Java @OneToMany JPA注释会导致不必要的sql更新,并且不会级联,java,spring,hibernate,jpa,cascade,Java,Spring,Hibernate,Jpa,Cascade,我正在将我的应用程序从基于xml的映射迁移到基于JPA注释的映射。但这只在一个简单的案例中失败。例如,我有以下3个实体: @Entitiy public class UserAccount { @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "user_account_id", nullable = false, insertab

我正在将我的应用程序从基于xml的映射迁移到基于JPA注释的映射。但这只在一个简单的案例中失败。例如,我有以下3个实体:

@Entitiy
public class UserAccount {

     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
     @JoinColumn(name = "user_account_id", nullable = false, 
                 insertable = true, updatable = false)
     @NotNull
     private Set<Authority> authorities;

     @OneToOne(cascade = CascadeType.ALL)
     @JoinColumn(name="USER_ID", nullable = false)

     ... get and setter
}

@Entity
public class Authority {

    @Column
    private String authority;

    ... get and setter
}

@Entity
public class User {
    ... some properties
}
发生这种情况是因为hibernate尝试更新之前未插入的权限行:

Hibernate: 
    insert into users ...

Hibernate: 
    insert into user_accounts ...

Hibernate: 
    update authorities set user_account_id=? where id=?
我使用以下服务来保存UserAccount实例

@Service
public class UserAccountService {

    @Resource
    private UserAccountRepository userAccountRepository;

    @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
    public void save(UserAccount userAccount) {

       userAccountRepository.save(userAccount);
    }

}
奇怪的是,用户实例将被保存,因此如果我删除UserAccount.authorities属性,OneToOne映射将级联。但这在使用基于xml的映射时有效,而不使用JPA。我最终调用了一个单独的方法来存储authory实例

@Service
public class UserAccountService {

    @Resource
    private UserAccountRepository userAccountRepository;
    @Resource
    private AuthorityRepository authorityRepository;

    @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
    public void save(UserAccount userAccount) {

        userAccountRepository.save(userAccount);
        authorityRepository.save(userAccount.getAuthoritiesSet());
    }

} 
也就是说,我手动级联。。。但是,通过查看已执行的SQL语句,我可以看到hibernate插入了authority实例,然后更新此行以设置UserAccount引用:

Hibernate: 
    insert into users ...

Hibernate: 
    insert into user_accounts ...

Hibernate: 
    insert into authorities (authority) values (?)

Hibernate: 
    update authorities set user_account_id=? where id=?
对我来说,这是一个性能问题,因为有很多权威机构,我不想有20个插入,然后是20个更新。但我无法删除更新并告诉hibernate将用户帐户id与权限一起设置

因为我有许多其他对象有一对一的关系,我非常有兴趣解决这个问题,并感谢您的帮助和想法

Hibernate:4.3.4.Final, spring数据jpa:1.5.1.0版本

致以最良好的祝愿, Daniel

…对象引用未保存的瞬态。。。表示已将子对象映射到父对象,并且在保存父对象之前尚未保存子对象

在您的情况下,在保存权限之前,您正在保存父用户帐户和子实体权限

您可以通过适当的级联为权威机构创建一个一对一的关系

 @OneToMany(cascade = CascadeType.ALL)
 private Set<Authority> authorities;

我通过将hibernate版本降级到4.2.11.Final解决了这两个问题。我不知道,为什么在4.3.4.Final中会出现这些问题。也许这是所有4.3.x版本中的一个问题

我对多通映射也有类似的问题。 通过向“版本”字段添加默认值解决了问题

@Version
@Column(name = "VERSION")
private Integer version = 1;

嗨,Jay,但这正是我在查看我的UserAccount对象时所做的。这真的很奇怪。请尝试删除所有父/子映射并逐个添加,然后检查问题从何处开始。这仍然是问题的解决方案吗?我现在也面临着类似的问题。我还没有尝试升级到4.3.5.Final。
authorityRepository.save(userAccount.getAuthoritiesSet());
@Version
@Column(name = "VERSION")
private Integer version = 1;