【发布时间】:2023-03-16 13:55:01
【问题描述】:
我正在尝试在 Spring Data Rest 上的 tutorial 之后将元素添加到 @OneToMany 关系,我正在使用以下请求将帐户添加到用户帐户集合。
curl -v -X PUT -H "Content-Type: text/uri-list" -d "http://localhost:8080/account/1" http://localhost:8080/user/1/accounts
请求以 204 响应,当我检查用户帐户列表时没有任何变化。调试应用程序我可以看到实体正在保存,所以可能没有发生事务提交。我还注意到,如果我将关系更改为 @OneToOne,请求会按预期工作。
用户类
@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = "accounts")
@EqualsAndHashCode(of = "id", callSuper = false)
@SequenceGenerator(name = "user_sq", sequenceName = "user_sq")
public final class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "user_sq")
private Long id;
//other properties
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", orphanRemoval = true)
private List<Account> accounts;
// @OneToOne(cascade = CascadeType.ALL)
// private Account accounts;
}
帐户类
@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id", callSuper = false)
@SequenceGenerator(name = "account_sq", sequenceName = "account_sq")
public final class Account extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "account_sq")
private Long id;
//other properties
@ManyToOne
private User owner;
}
存储库
@RepositoryRestResource(collectionResourceRel = "accounts", path = "account")
public interface AccountRepository extends PagingAndSortingRepository<Account, Long> {}
@RepositoryRestResource(collectionResourceRel = "users", path = "user")
public interface UserRepository extends PagingAndSortingRepository<User, Long> {}
【问题讨论】:
-
可能是龙目岛问题。尝试手动设置器和获取器
-
这可能是由于关系是双向的。如果您在代码中执行此操作,则需要设置关系的双方以使关系正确级联。您可以尝试删除从 Account 到 Owner 的反向引用,看看这是否会影响结果?如果这证实了原因,请在此处查看解释和可能的解决方法:stackoverflow.com/questions/30464782/…
-
谢谢@AlanHay!另一个帖子做到了,解决方案有点奇怪,也许我将来可以找到更好的解决方案(如果有的话)。在这种情况下,删除双向是一种选择,但在未来的另一个场景中可能不会,并且使用 @PreUpdate/@PrePersist 感觉不对,我认为我不需要使用它(两种解决方案都有效)
标签: spring spring-data spring-data-rest