ConstraintViolationException usando @OneToOne fetch = Lazy

Bom dia

Tenho uma relação OneToOne onde a PK do “filho” é a PK do “pai”, até então a relação funcionava e estava dessa maneira:

Classe Pai:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@PrimaryKeyJoinColumn(name = "id")
private Cliente cliente;

Classe Filho:

@MapsId
@OneToOne(fetch = FetchType.LAZY, mappedBy = "cliente", optional = false)
@JoinColumn(name = "id")
private Pessoa pessoa;

Mas estou tentando melhorar performance da aplicação e mudei o mapeamento da classe “pai” para:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY, optional = false)
@PrimaryKeyJoinColumn(name = "id")
private Cliente cliente;

Agora ao tentar gravar a classe Pai, ele tenta gravar o Filho, mas tenta gravar também a propriedade pessoa na classe Filho e ela está nula. E ocorre ConstraintViolationException.

Porque ele tenta persistir e como eu poderia corrigir isso?

É só observar o que é opcional.

Concordo, eu sei disso.

Não sei se é um erro de conhecimento conceitual meu, se eu retirar o optional ou seja deixa o default que é true dessa maneira:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn(name = "id")
private Cliente cliente;

Ele não fica como Lazy. Por padrão o Hibernate sempre carrega ele e justamente o que eu estou tentando evitar é sempre o carregamento desses relacionamentos @OneToOne.

Li alguns artigos a respeito disso e ainda não consegui chegar em uma solução, pelo menos que eu entendi o @OneToOne com Lazy, não funciona como Lazy. E ai você tem que dar uma volta no Hibernate para enganá-lo.

É isso que eu estou tentnado entender, se deixar optional = true como você sugeriu, ai funciona mesmo.