![](/img/trans.png)
[英]Not able to use JPA annotation @OneToOne(cascade=CascadeType.ALL)
[英]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.REQUIRED
和readonly=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.