Java @OneToMany JPA注释会导致不必要的sql更新,并且不会级联
我正在将我的应用程序从基于xml的映射迁移到基于JPA注释的映射。但这只在一个简单的案例中失败。例如,我有以下3个实体: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
@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;