@JsonIgnoreProperties JPA — не игнорировать свойства

avatar
Geek
1 июля 2021 в 16:10
59
0
1

У меня есть часто задаваемые вопросы, как показано ниже. Здесь поле createdBy имеет связь manyToOne с сущностью пользователя. Ниже joinColumns показывает ассоциацию. В объекте User у меня есть отношение OneToMany с UserRoles и UsersUnit, которое ОЧЕНЬ загружается для пользователя, а не для часто задаваемых вопросов. Поэтому я добавил @JsonIgnoreProperties для UsersUnit и UsersRole, и соответствующий объект User показан ниже.

@Entity
@Table(name = "FAQ", catalog="abc")
public class Faq implements Serializable {
    public Faq() {
        super();
    }
    
    @Column(name = "CREATE_DATE")
    private Timestamp createDate;
    @Where(clause = "DELETE_DATE is null")
    @Column(name = "DELETE_DATE")
    private Timestamp deleteDate;
    @Column(name = "DELETED_BY")
    private BigDecimal deletedBy;
    @Column(name = "DOC_BLOB", nullable = false)
    @JsonIgnore
    private byte[] docBlob;
    @Column(name = "DOC_NAME", nullable = false, length = 100)
    private String docName;
    @Id
    private BigDecimal id;
    
    @Column(name = "ORDER_BY")
    private BigDecimal orderBy;
    
    @Column(name = "UPDATE_DATE")
    private Timestamp updateDate;
    @Column(name = "UPDATED_BY")
    private BigDecimal updatedBy;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name="created_by", referencedColumnName="id")
    })
    private User faqCreatedBy;
   
}

Объект пользователя:

@Entity
@Table(name = "USERS", catalog="abc")
@JsonInclude(Include.NON_NULL)
public class User extends EntityLog{
    
    private BigDecimal id;
    private BigDecimal edipi;
    private String firstname;
    private String lastname;
    private String email;
    ..///
    
    private Set<UsersRoles> userRoles;
    private Set<UsersUnit> usersUnit;
    
        @Id
    @Column(name="id")
    public BigDecimal getId() {
        return id;
    }
    
    
    ...///
        @Column
    @JsonIgnoreProperties({ "faqCreatedBy" })
    @OneToMany(fetch = FetchType.EAGER,mappedBy = "user",cascade = {CascadeType.ALL})
    @JsonManagedReference
    public Set<UsersRoles> getUserRoles() {
            return userRoles;
    }
        
        
        
        ...///
    
        @Column
    @JsonIgnoreProperties({ "faqCreatedBy" })
    @OneToMany(fetch = FetchType.EAGER,mappedBy = "user",cascade = {CascadeType.ALL})
    @JsonManagedReference
    public Set<UsersUnit> getUsersUnit() {
        return usersUnit;
    }
    
    ////...
    
    }
    

С этим изменением я ожидаю, что FAQ загрузится с сущностью пользователя, но я не жду загрузки UsersRoles и UsersUnit. Но это не то, что я вижу. Когда faq загружается, он загружает User и UsersRoles и UsersUnit. Я использую Spring JPA к вашему сведению. Любые выводы, что не так? Благодарим за любой вклад.

Источник
Yserbius
1 июля 2021 в 16:28
0

Отвечает ли это на ваш вопрос? @JsonIgnore не игнорирует поля в спящем режиме Entity

Nikos Paraskevopoulos
1 июля 2021 в 17:39
0

ИМХО корень проблемы в нарушении разделения интересов. Здесь речь идет о «передаче данных» и «постоянстве», реализованных в одном и том же объекте. Это случается слишком часто, к сожалению. Я всегда использую отдельные DTO и Entities, даже несмотря на то, что преобразование сопряжено с некоторыми дополнительными трудностями. В любом случае, если вы предполагаете, что если вы аннотируете, например. getUserRoles с @JsonIgnoreProperties({"faqCreatedBy"}) Джексон не получит доступ к этому полю, если он загружен через свойство faqCreatedBy, я думаю, JsonIgnoreProperties работает не так!

Ответы (0)