Java 对象引用未保存的瞬态,即使使用CascadeType。全部
我知道关于这个主题有很多问题,但是我无法解决我的问题,甚至添加了Java 对象引用未保存的瞬态,即使使用CascadeType。全部,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我知道关于这个主题有很多问题,但是我无法解决我的问题,甚至添加了CascadeType.ALL 我有两个名为UserMenu和MenuItem的表(有一对多关系) UserMenuDTO: @实体 @表(…) @EntityListeners(AuditableListener.class) 公共类UserMenuDTO实现可审核{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) 私人长id; @列(“…”) @不空白 私有字符串名称; @O
CascadeType.ALL
我有两个名为UserMenu和MenuItem的表(有一对多关系)
- UserMenuDTO:
@实体
@表(…)
@EntityListeners(AuditableListener.class)
公共类UserMenuDTO实现可审核{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(“…”)
@不空白
私有字符串名称;
@OneToMany(mappedBy=“userMenuDTO”,cascade=CascadeType.ALL,orphanRemoving=true)
私有列表菜单=新建ArrayList();
@OneToOne(级联=级联类型.ALL)
@JoinColumn(“…”)
私人QrCodeDTO QrCodeDTO;
@许多酮
@JoinColumn(“…”)
私有用户到用户;
- MenuItemDTO:
@实体
@表(“…”)
@EntityListeners(AuditableListener.class)
公共类MenuItemDTO实现可审核{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
// ...
@列(“…”)
@不空白
@尺寸(最大值=100)
私有字符串名称;
@OneToOne(级联=级联类型.ALL)
@JoinColumn(name=“…”)
私人菜单到菜单到菜单;
@许多酮
@JoinColumn(name=“…”)
私有UserMenuDTO UserMenuDTO;
- 下面是我将menuitem添加到usermenu的代码:
public static void addMenuItemToUserMenu(UserMenuDTO UserMenuDTO,MenuItemDTO MenuItemDTO){
userMenuDTO.getmenumes().add(menuItemDTO);
menuItemDTO.setUserMenuDTO(userMenuDTO);
}
- 当我将新菜单项插入用户菜单列表时,我遇到以下错误:(cascadeType.ALL无效)
InvalidDataAccessApiUsageException:org.hibernate.TransientObject异常:
对象引用未保存的临时实例-
刷新前保存临时实例:…MenuItemDTO;
如果我在保存用户菜单之前保存菜单项,一切正常。我只想在一条语句中保存所有项
我如何解决这个问题
- 更新(持久化操作的详细信息)
public void persist(){
UserMenuDTO UserMenuDTO=;//这是通过用户ID从数据库中获取的;
MenuItemDTO newMenuItemDTO=;//从请求正文创建
addMenuItemToUserMenu(userMenuDTO,newMenuItemDTO);
saveUserMenuDTO(userMenuDTO);
}
@服务
@交易的
公共类用户服务{
@凌驾
public void saveUserMenuDTO(UserMenuDTO UserMenuDTO){
userMenuRepository.save(userMenuDTO);
}
}
@存储库
公共接口UserMenuRepository扩展了JpaRepository{
}
如果看到您的persist
方法,问题在于新的menuItem
对象,因为它没有附加到持久性上下文(换句话说,它是暂时的)当您将此临时对象分配给从数据库获取的现有userMenuDTO
实例时,从数据库获取的此实例附加到当前spring持久化上下文。因此,为了更新此已持久化对象的菜单列表,您必须持久化新创建的menuItem
首先,然后将这个持久化的menuItem
添加到菜单
列表中,最后保存userMenuDTO
。
CascadeType。如果新创建了userMenuDTO
和menuItemDTO
实例,并且您是第一次将它们保存到数据库中,则所有
都可以工作。请共享将userMenuDTO持久化到数据库中的完整代码。@Naqi,我添加了详细信息,请查看“更新”(持久化操作的详细信息)““如果userMenuDTO和menuItemDTO实例都是新创建的,那么CascadeType.ALL就可以工作了”这对我来说是新的,谢谢你的回答