簡體   English   中英

Spring data CrudRepository (hibernate) findone return null

[英]Spring data CrudRepository (hibernate) findone return null

出於某種原因,我無法通過 Id 找到現有實體

該實體具有以下視圖:

@Entity
@Table(name = "persons")
@NamedEntityGraph(name = "includeRemunerationAndCredential",attributeNodes = {
    @NamedAttributeNode("remunerations"),
    @NamedAttributeNode("credentials")
})
@JsonSerialize
public class Person implements Serializable {

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

@Column(name = "first_name", nullable = false, length = 50)
@NotNull
private String firstName;

@Column(name= "second_name",  nullable = false, length = 50)
@NotNull
private String secondName;

@Column(name = "father_name", length = 50)
private String fatherName;

@Column(name = "phone_number", length = 20)
private String phoneNumber;

@Column(name = "date_of_birth")
private LocalDateTime dateOfBirth;

@Column(name = "role", nullable = false, length = 50)
@Enumerated(EnumType.STRING)
private Role role;

@Column(name = "date_of_creation", nullable = false)
@NotNull
private LocalDateTime dateOfCreation;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "carwash")
private CarWash carWash;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "person")
private List<Remuneration> remunerations;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "person")
private Set<Credential> credentials;

@Column(name = "enable", nullable = false)
private Boolean enable;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "owner", nullable = false)
private Owner owner;

// getters and setters

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Person person = (Person) o;

    return id != null ? id.equals(person.id) : person.id == null;

}

@Override
public int hashCode() {
    return id != null ? id.hashCode() : 0;
}

@Override
public String toString() {
    return "Person{" +
            "id=" + id +
            ", firstName='" + firstName + '\'' +
            ", secondName='" + secondName + '\'' +
            ", fatherName='" + fatherName + '\'' +
            ", phoneNumber='" + phoneNumber + '\'' +
            ", dateOfBirth=" + dateOfBirth +
            ", role=" + role +
            ", dateOfCreation=" + dateOfCreation +
            ", carWash=" + (carWash == null ? carWash : carWash.getId()) +
            ", remunerations=" + (remunerations == null ? remunerations : remunerations.size()) +
            ", enable=" + enable +
            ", owner=" + (owner == null ? "N/A" : owner.getName()) +
            '}';
}

我的 DAO 有以下觀點:

public interface PersonDAO extends CrudRepository<Person, Long> {}

我的服務是由這個班級提供的

@Service("userDetailsService")
@Transactional
public class MyUserDetailService implements UserDetailsService {

@Autowired
PersonDAO personDAO;

@Override
@Transactional(readOnly = true)
public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
    //final Iterable<Person> all = personDAO.findAll();
    final Person one = personDAO.findOne(15L);

    return null;
}

因此,如果在服務personDAO.findAll()填充被注釋,則personDAO.findOne(15L)返回 null 但如果findAll()未提交,則將找到findOne(15L) 熱修復findOne在沒有findAll()

幾天前我剛剛遇到了完全相同的問題,然后我發現發生這種情況的原因是我正在檢索的實體具有對另一個實體的外部引用,此后又對另一個實體進行了外部引用第三個實體和這些 [references] 中的后者被配置為不可為空,但問題是在檢查數據庫時,所查找的項目在外鍵中實際上具有空值; 因此,當持久性框架將服務轉換為查詢時,它會進行內部連接而不是外部連接,從而從結果中刪除實體,因為第二個和第三個實體之間的連接由於空值而失敗。

刪除第二個實體字段中的上述不可為空子句修復了問題[在檢索第一個實體的服務中]

請檢查您的實體是否未以類似方式映射:例如,我可以看到實體 Person 具有對實體所有者的外部引用,該實體所有者不可為空; 也許所有者為空,這就是問題所在? 如果它不為空,請檢查所有其他外部引用,然后檢查對其他其他第三方實體的所有內部引用鏈,以確保您沒有在相對列有效的這些字段之一中強制執行非空可以為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM