Dependências circulares de Jackson

Tenho uma dependência circular que estou lutando para resolver agora. Tome essas duas classes - código da placa da caldeira removido para fins de demonstração

Classe 1

@Entity
@Table(name = "T_CREDENTIAL")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class Credential implements Serializable {

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


    //Removed @JsonIgnore as want to disable certain fields if no credentials are available    
    //Also fetch this in an eager fashion instead of lazily loading it
    @OneToMany(mappedBy = "credential",fetch=FetchType.EAGER)
    private Set<UserTask> userTasks = new HashSet<>();

    ....

    .....

Classe 2

@Entity
@Table(name = "T_USERTASK")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class UserTask implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -8179545669754377924L;


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


    @ManyToOne(fetch=FetchType.EAGER)
    @NotNull(message = "Credential must not be null")
    private Credential credential;

Infelizmente, tenho casos de uso em que o UserTask precisa carregar as credenciais e casos em que a Credencial precisa carregar os Usertasks

A anotação @JsonIdentityInfo parece estar realizando seu trabalho. Se eu carregar todas as UserTasks, ele carregará a primeira userTask e sua credencial, mas esse objeto de credencial também carregará as UserTasks atribuídas a essa credencial. Isso então encontra o novo @Id ou um userTask que agora o carrega com a credencial em vez de com 2 tarefas de usuários

Alguma idéia do que eu posso fazer para contornar esse problema?

Cheers Damien

--Atualização da pergunta Atualizei meu código agora para usar as novas anotações mencionadas por outros usuários

Classe 1

    @Entity
@Table(name = "T_CREDENTIAL")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Credential implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -8696943454186195541L;



    //Removed @JsonIgnore as want to disable certain fields if no credentials are available    
    //Also fetch this in an eager fashion instead of lazily loading it
    @OneToMany(mappedBy = "credential",fetch=FetchType.EAGER)
    @JsonManagedReference("credential")
    private Set<UserTask> userTasks = new HashSet<>();
    ....
....

Classe 2

@Entity
@Table(name = "T_USERTASK")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class UserTask implements Serializable {


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

    @ManyToOne(fetch=FetchType.EAGER)
    @NotNull(message = "Credential must not be null")
    @JsonBackReference("credential")
    private Credential credential;
....
....

Essas classes agora funcionam e não têm dependências circulares. No entanto, quando faço uma consulta agora para obter minhas tarefas de usuário ou uma única tarefa, o objeto de credencial não é retornado, mesmo que eu não tenha a anotação @jsonIgnore especificada. Alguma ideia do que está causando isso?

questionAnswers(2)

yourAnswerToTheQuestion