переход в режим гибернации один к одному с использованием первичного ключа не работает

У меня есть 2 объекта в спящем режиме A и B. Вот соответствующий код.

@Entity
public class A {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @OneToOne(mappedBy = "a", cascade = CascadeType.ALL)
    private B b;
}

@Entity
public class B {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "a_id")
    @GeneratedValue(generator = "gen")
    @GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name = "property", value = "a"))
    private Integer aId;

    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @PrimaryKeyJoinColumn
    private A a;
}

Я сделал то же самое, что указано в приведенной ниже ссылке один к одному сопоставление с использованием столбца соединения первичного ключа

Однако, когда я делаю следующий запрос hql,

"from A a left join a.b"

соединение принимается при следующем условии

a.id = b.id 

хотя то, что я хочу, это следующее условие

a.id = b.aId

person abhinav kumar    schedule 09.08.2017    source источник
comment
Не могли бы вы отметить мой ответ как ответ?   -  person Mehdi Javan    schedule 12.08.2017


Ответы (2)


Вы должны использовать @JoinColumn(name = "a_id") вместо @PrimaryKeyJoinColumn. Кстати, вы не можете определить два поля в одном столбце. Однако, если вам нужно это сделать, вы должны сделать один из них недоступным для вставки и обновления, например:

@JoinColumn(name = "a_id", insertable = false, updatable = false)
person Mehdi Javan    schedule 09.08.2017

Вы дали ссылку класса A на поле a в классе B.

@OneToOne(fetch = FetchType.LAZY, optional = false)
@PrimaryKeyJoinColumn
private A a;

И класс B в поле b в классе A

@OneToOne(mappedBy="a", cascade=CascadeType.ALL)
    private B b;

поэтому по умолчанию Hibernate создает запрос на соединение со ссылочным полем. Таким образом, hibernate по умолчанию выполняет соединение на a.id = b.id. Но я думаю, что вы можете создать свой собственный запрос и использовать собственный запрос для выполнения соединения с a.id = b.aId.

person CIPHER007    schedule 09.08.2017