Hiberate one-to-one annotaion создает неправильный SQL-запрос - PullRequest
0 голосов
/ 07 апреля 2019

У меня небольшая проблема с запросом гибернации с отношением «один к одному». Я создал 3 объекта.В случае отношения «один к одному» между пользователями это работает правильно.Я использую свойство create в конфигурации Hiberanate, и он создает правильную таблицу с правильным FK.Корректное создание записи тоже

MyUser user = new MyUser();
user.setLogin("Mark");
user.setPassword("123456");

MyPresence presence = new MyPresence();
presence.setPresenceId(2);
presence.setUser(user);

session.beginTransaction();
session.save(user);
session.save(presence);
session.getTransaction().commit();
session.close();

, если получить пользователя по присутствию, это работает правильно

int id = 2;
MyPresence myPresence = session.load(MyPresence.class, id);
System.out.println(myPresence);

Но когда я пытаюсь получить присутствие пользователя по результату из спящего режима базы данных, неверный SQL-запрос

int id = 3;
MyUser myUser = session.load(MyUser.class, id);
System.out.println(myUser);

Созданный Hibernate sql:

Hibernate: select myuser0_.id as id1_2_0_, myuser0_.group_id as group_id4_2_0_, myuser0_.login as login2_2_0_, myuser0_.password as password3_2_0_, mypresence1_.id as id1_1_1_, mypresence1_.presence_id as presence2_1_1_, mypresence1_.updated_at as updated_3_1_1_, mypresence1_.user_id as user_id4_1_1_ from users myuser0_ left outer join user_presence mypresence1_ on myuser0_.id=mypresence1_.id where myuser0_.id=?

Но я ожидаю увидеть on myuser0_.id=mypresence1_.user_id вместо on myuser0_.id=mypresence1_.id

MyUser.java

@Entity
@Table(name = "users")
public class MyUser {

    private int id;
    private String login;
    private String password;
    private MyGroup group;
    private MyPresence presence;

    public MyUser() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "login")
    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    @Column(name = "password")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @JoinColumn(name = "group_id")
    @OneToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
    public MyGroup getGroup() {
        return group;
    }

    public void setGroup(MyGroup group) {
        this.group = group;
    }

    @OneToOne(cascade = CascadeType.DETACH)
    @JoinColumn(name = "id", referencedColumnName = "user_id")
    public MyPresence getPresence() {
        return presence;
    }

    public void setPresence(MyPresence presence) {
        this.presence = presence;
    }
}

MyPresence.java

@Entity
@Table(name = "presence")
public class MyPresence {

    private int id;
    private MyUser user;
    private int presenceId;
    private Date updatedAt;

    public MyPresence() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    public MyUser getUser() {
        return user;
    }

    public void setUser(MyUser user) {
        this.user = user;
    }

    @Column(name = "presence_id")
    public int getPresenceId() {
        return presenceId;
    }

    public void setPresenceId(int presenceId) {
        this.presenceId = presenceId;
    }

    @Column(name = "updated_at")
    public Date getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }
...