繁体   English   中英

cascade = CascadeType.ALL 不适用于 OneToOne 关系

[英]cascade = CascadeType.ALL doesn´t work on OneToOne relation

我对一对一关系有一个问题。

我有一个只有一个团队的用户

用户实体


@Entity
@Table(name = "USER")
@Data @NoArgsConstructor @AllArgsConstructor @Builder
public class User implements Serializable {

    private static final long serialVersionUID = 3233149207833106460L;
    
    @Id
    @GeneratedValue
    @Column(name = "USERID")
    private Long id;
    
    ...
 
    @OneToOne(mappedBy = "user")
    private Team team;

}

团队实体


    

@Entity
@Table(name = "TEAM")
@Data @NoArgsConstructor @AllArgsConstructor @Builder
public class Team implements Serializable {

    private static final long serialVersionUID = 3233149207833106460L;
    
    @Id
    @GeneratedValue
    @Column(name = "TEAMID")
    private Long id;

...
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "USERID")
    private User user;
    
    
}

这就是我尝试创建 object 的方式。


    
        //create Team and add to User
        Team team = Team
                .builder()
                .value(TeamConstants.INITIAL_VALUE)
                .name(userDetailsForm.getUsername()+" "+TeamConstants.TEAM)
                .country(userDetailsForm.getUsername()+" "+TeamConstants.COUNTRY)
                .build();

        
        User user = User
                .builder()
                .username(userDetailsForm.getUsername())
                .password(this.passwordEncoder.encode(userDetailsForm.getPassword()))
                .email(userDetailsForm.getEmail())
                .registerDate(DateUtil.getNow())
                .role(userDetailsForm.getRole())
                .team(team)
                .build();
        
        team.setUser(user);
        
        this.userRepository.save(user);

当我尝试保存用户(并自动创建子团队)时,它给了我错误

Blockquote org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: com.soccermanager.business.entities.user.User.team -> com.soccermanager.business.entities.team.Team;

对解决方案有任何想法吗?

这是我在这里的第一个问题,我希望它是正确的。

谢谢你的时间

您应该在用户之前保存您的团队实体。 仅当您在同一个 JPA 事务单元中工作时,您才应该这样做。 如果没有,它将不起作用,并且您会遇到该异常。 尝试在该方法上添加@Transactional注释,并使用可选参数,如propagation = Propagation.REQUIREDreadonly=false ,因为您在此处创建/更新对象:

@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
protected User saveTeamWithUser(UserDetailsForm form) {
    //    ...
}

请与团队实体进行交互,然后用户将按照 CascadeType 进行更改

或者您需要添加@OneToOne(mappedBy = "user", cascade = CascadeType.ALL) private Team team; 在用户 class 中。

请尝试两者,您会看到不同的地方。 希望这个帖子的答案可以帮助你

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM