соединение один к одному на составном первичном ключе в jpa - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть две таблицы. Один имеет первичный ключ, а другой - составной ключ.

TableA:

@Entity
@Table(name = "TableA")
public class TableA {

    @Id
    @Column(name = "myId")
    private Long id;

    @Column(name = "myName")
    private String name;

    @Column(name = "myRegion")
    private String regionName;
}

Составной ключ для таблицы B:

@Embeddable
public class CompositePK implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "myId", insertable=false, updatable=false)
    private Long myId;

    @Column(name = "secondaryId")
    private String secondaryId;

}

TableB:

@Entity
@Table(name = "TableB")
public class TableB {

    @EmbeddedId
    private CompositePK compositePK;

    @Column(name = "Data")
    private String regulationText;
}

Теперь я хочу реализовать запрос

select * from TableA tableA 
        inner join TableB tableB 
        on tableA.myId=tableB.myId
        where tableB.myId = 1;

Я попробовал приведенный ниже фрагмент в Таблице B (соединение один к одному).

@OneToOne(cascade = CascadeType.ALL)
    @JoinTable(name = "TableA", inverseJoinColumns = @JoinColumn(name = "myId", referencedColumnName = "myId"))
    private TableA tableA;

Но там написано, что неверный столбец secondId. Фиг с этим за день. Невозможно объединить таблицу с первичным ключом из составного ключа. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы должны изменить TableB, чтобы использовать «производную идентификацию»:

@Entity
@Table(name = "TableB")
public class TableB {

    @EmbeddedId
    private CompositePK compositePK;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "myId", referencedColumnName = "myId")
    @MapsId("myId") // maps 'myId' attribute of embedded id CompositePK
    private TableA tableA;

    @Column(name = "Data")
    private String regulationText;
}

Производные идентификаторы обсуждаются (с примерами) в спецификации JPA 2.1 в разделе 2.4.1.

0 голосов
/ 25 апреля 2018

В случае составного вам нужен доступ к нему с помощью составного ключевого объекта, как показано ниже:

 @OneToOne(cascade = CascadeType.ALL)
 @JoinTable(name = "TableA", inverseJoinColumns = @JoinColumn(name = 
 "compositePK.myId", referencedColumnName = "myId"))
 private TableA tableA;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...