![](/img/trans.png)
[英]Generation query when the ManyToMany relationship is used by Spring Data Jpa project
[英]ManyToMany relationship not working when executing query (Spring Data JPA)
我有一個 UserEntity 和一個 RoleEntity。 UserEntity 包含一個字段“roles”,它是 HashSet 類型並使用 @ManyToMany 注釋進行注釋。 當調用我的自定義查詢“findByEmail”時,它成功獲取了 UserEntity,但角色集保持為空。
這里的代碼的一些部分:
package xyz.michaeltprojects.collchecklist.security.persistence;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
@Entity
@Table(name = "users")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class UserEntity {
@Id
@GeneratedValue
private UUID id;
@NotBlank
@Size(min = 3, max = 30)
private String username;
@NotBlank
@Size(min = 6, max = 50)
@Email
private String email;
@NotBlank
@Size(max = 120)
private String password;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<RoleEntity> roles = new HashSet<>();
}
package xyz.michaeltprojects.collchecklist.security.persistence;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.util.UUID;
@Entity
@Table(name = "roles")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class RoleEntity {
@Id
@GeneratedValue
private UUID id;
@Enumerated(EnumType.STRING)
@Column(length = 20)
private ERole name;
}
package xyz.michaeltprojects.collchecklist.security.persistence;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
import java.util.UUID;
@Repository
public interface UserRepository extends JpaRepository<UserEntity, UUID> {
Optional<UserEntity> findByEmail(String email);
Boolean existsByUsername(String username);
Boolean existsByEmail(String email);
}
我已經以某種方式解決了這個問題......似乎填充關系不適用於 UUID 作為標識符。 當我用多頭替換它們時,它工作得很好。 看起來很奇怪,但它就像是
你ManyToMany
不正確,你需要使用referencedColumnName
來引用每個表的 id
看看這個:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
private Set<RoleEntity> roles;
你能試試這個嗎? 通過在 UserEntity 類下面添加覆蓋 function setRoles(..)
package xyz.michaeltprojects.collchecklist.security.persistence;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
@Entity
@Table(name = "users")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class UserEntity {
@Id
@GeneratedValue
private UUID id;
@NotBlank
@Size(min = 3, max = 30)
private String username;
@NotBlank
@Size(min = 6, max = 50)
@Email
private String email;
@NotBlank
@Size(max = 120)
private String password;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<RoleEntity> roles = new HashSet<>();
public UserEntity setRoles(final Set<RoleEntity> roles) {
this.roles.clear();
if (roles != null) {
this.roles.addAll(roles);
}
return this;
}
}
你必須刪除new HashSet<>();
來自用戶實體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.