gpt4 book ai didi

java - JPA - 无法删除实体关系的多方

转载 作者:行者123 更新时间:2023-12-01 16:48:37 26 4
gpt4 key购买 nike

我在配置文件和链接实体之间有一个简单的 @ManyToOne 和 @OneToMany 关系。在这些实体的任何属性中应用的更改都通过 ProfileRepository.save(profile) 进行保存/更新。在这两种情况下,一切正常,如果将新链接添加到 Profile.links,则新链接将保存到数据库,同样,如果我更改现有链接,则此链接的修改值将在数据库中更新。

当我从配置文件列表中删除现有链接时,我期望发生的是相同的链接也会从数据库中删除,但它没有发生。

我在这里缺少什么?

@Entity
@Table(name = "profiles")
public class Profile {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "user_id", unique = true)
private Long userId;

@OneToMany(mappedBy = "profile", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Link> links = new ArrayList<>();

public void addLink(Link link) {
links.add(link);
link.setProfile(this);
}

// ...

.

@Entity
@Table(name = "links")
public class Link {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotEmpty(message = "Description cannot be empty")
private String description;

@NotEmpty(message = "Link cannot be empty")
private String url;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "profile_id", nullable = false)
private Profile profile;

// ...

.

public ProfileDTO updateProfile(ProfileDTO profileDTO) {

Optional<Profile> optProfile = profileRepository.findByUserId(profileDTO.getUserId());

Profile profile = optProfile
.orElseThrow(() -> new UserNotFoundException(profileDTO.getUserId()));

List<Link> links = profileDTO.getLinks()
.stream()
.map(l -> aLink()
.withId(l.getId())
.withDescription(l.getDescription())
.withUrl(l.getUrl())
.build())
.collect(toList());

profile.addLinks(links);
profile.setDescription(profileDTO.getDescription());

return ProfileDTOBuilder.from(profileRepository.saveAndFlush(profile));
}

.

@Repository
public interface ProfileRepository extends JpaRepository<Profile, Long> {
Optional<Profile> findByUserId(Long userId);
}

更新

如果我使用测试类运行相同的代码并保留 Profile实体 TestEntityManager ,它按预期工作。链接已从内存数据库中删除。

    entityManager.persist(profile);
entityManager.flush();

最佳答案

What I was expecting to happen when I remove an existent Link form Profile list, is that the same Link would be removed from DB also, but it is not happening.

JPA 无法以这种方式工作,您必须实际删除实体。

对于 Hibernate,您可以使用 org.hibernate.annotations.CascadeType.DELETE_ORPHAN

参见Hibernate deleting orphans when updating collection

关于java - JPA - 无法删除实体关系的多方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61733988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com