@JoinColumnS включает выборку EAGER в однозначном отношении - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть связь @OneToOne между двумя классами со следующей структурой:

Пользователь:

@Getter
@Setter
@NoArgsConstructor
@Entity
public class User implements Serializable {

    @Id
    private Integer id;
    private String login;
    private String password;
    private String name;
    private String address;
    private Boolean active;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns( {@JoinColumn(name = "userDetailId", referencedColumnName="id",  insertable=false, updatable=false),
            @JoinColumn(name = "address", referencedColumnName="location", insertable=false, updatable=false)} )
    private UserDetail userDetail;

}

UserDetail:

@Getter
@Setter
@NoArgsConstructor
@Entity
public class UserDetail implements Serializable {
    @Id
    private Integer id;
    private String location;

}

В моем репозитории user я использую entityGraph для получения левого соединения в запросе для userDetail

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
     @EntityGraph(attributePaths = {"userDetail"})
     List<User> findAll();
}

Когда я вызываю findAll (), я ожидаю получить запрос на левое соединение, поэтому hibernate делает запрос с левым соединением плюс запрос по user_detail для каждой строки в таблице пользователя, как следует:

Hibernate: 
    select
        user0_.id as id1_0_0_,
        userdetail1_.id as id1_1_1_,
        user0_.active as active2_0_0_,
        user0_.address as address3_0_0_,
        user0_.login as login4_0_0_,
        user0_.name as name5_0_0_,
        user0_.password as password6_0_0_,
        user0_.user_detail_id as user_det7_0_0_,
        userdetail1_.location as location2_1_1_ 
    from
        user user0_ 
    left outer join
        user_detail userdetail1_ 
            on user0_.user_detail_id=userdetail1_.id 
            and user0_.address=userdetail1_.location
Hibernate: 
    select
        userdetail0_.id as id1_1_0_,
        userdetail0_.location as location2_1_0_ 
    from
        user_detail userdetail0_ 
    where
        userdetail0_.id=? 
        and userdetail0_.location=?

Как отключить запрос по use_detail? у меня есть попытка

@Fetch(FetchMode.JOIN)
@LazyToOne(LazyToOneOption.NO_PROXY)

И когда я использую один первичный ключ @JoinColumn вместо @JoinColumnS hibernate, сделать только один запрос с левым соединением, как я, но мне нужно несколько ключей. ссылка на ПО c здесь

Спасибо, что читаете меня

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Это не так просто возможно, как это делается с помощью @OneToMany (которая по умолчанию Lazy) или @ ManyToOne

И возможное решение будет иметь только сущность, которая может быть равна нулю. Ссылка на один и получить эту сущность по требованию.

{ ссылка } дает хорошее объяснение.

0 голосов
/ 13 февраля 2020

Я бы попробовал использовать attribut необязательный = true с аннотацией @OneToOne:

@OneToOne(optional=false)

Я решил это в прошлом, и если я правильно помню, это может быть правильным для вашей цели.

...