@OneToOne with FetchType.LAZY doesn't work with Hibernate

I have an entity with @OneToOne relation between entities country -> language.

EntityCountry relation with language works as FetchType EAGER (default):

@JoinColumn(name = "language_id", updatable = false, insertable = false)
@OneToOne
private LanguageEntity language;

But I don’t want EAGER, so I try LAZY, this both configurations work:
This two, although it is EAGER, throws a query during retrieveing the information to get the language:

    @JoinColumn(name = "language_id", updatable = false, insertable = false)
    @Fetch(FetchMode.SELECT)
    @OneToOne(fetch = FetchType.EAGER)
    private LanguageEntity language;
    @JoinColumn(name = "language_id", updatable = false, insertable = false)
    @Fetch(FetchMode.JOIN)
    @OneToOne(fetch = FetchType.LAZY)
    private LanguageEntity language;

Anyway, I want the easiest configuration and this should work (neither of this two work), and I don’t know why is not working (just default LAZY in a @OneToOne relation):

    @JoinColumn(name = "language_id", updatable = false, insertable = false)
    @OneToOne(fetch = FetchType.LAZY)
    private LanguageEntity language;
    @JoinColumn(name = "language_id", updatable = false, insertable = false)     
    @Fetch(FetchMode.SELECT)
    @OneToOne(fetch = FetchType.LAZY)
    private LanguageEntity language;

I’m using Hibernate 5.2.17 and elide io 4.2.8

You don’t need to combine the @Fetch annotation with the fetch attribute.

So, this is enough:

@JoinColumn(name = "language_id", updatable = false, insertable = false)
@OneToOne(fetch = FetchType.LAZY)
private LanguageEntity language;

Anyway, using EAGER is a bad idea since it can easily lead to N+1 query issues if you forget to join fetch all EAGER attributes during fetching.

My problem is that the example that you tell me doesn’t work (I don’t know where is the problem… what configuration can modify this behaviour? Your example doesn’t throw the SQL statement).

To see the SQL statement during fetching on that onetoone relation, I can do only this two:

    @JoinColumn(name = "language_id", updatable = false, insertable = false)
    @Fetch(FetchMode.SELECT)
    @OneToOne(fetch = FetchType.EAGER)
    private LanguageEntity language;
    @JoinColumn(name = "language_id", updatable = false, insertable = false)
    @Fetch(FetchMode.JOIN)
    @OneToOne(fetch = FetchType.LAZY)
    private LanguageEntity language;

I don’t know what can be happening to make your example work.
Anyway I don’t know which of this two is better to use.

You can find plenty of examples in the Hibernate documentation folder.

Only via logging, you can see that lazy loading works. If you assess it during debugging in the IDE, the IDE will trigger the load during property inspection, hence it will mislead you.

Thank you vlad, anyway do you know if some configuration can do what my @OneToOne is doing?

If you provide a replicating test case, I can tell you then.