Сделать внешний ключ первичным ключом в модели - PullRequest
0 голосов
/ 15 октября 2018

Мне нужно сделать столбец внешнего ключа в качестве первичного ключа в моей модели приложения гибернации.когда я устанавливаю @Id, возникает ошибка.это моя модель

@Entity
@Table(name = "otp")
public class OTP {
@Id
private Origin origin;
private int code;
@Column(name = "created_at", nullable = true)
private Date created_at=new Date();
}

Над моделью сущности нельзя добавить идентификатор.Итак, как добавить идентификатор для столбца внешнего ключа.Как видите, у меня есть класс происхождения один к одному.Мне нужно, чтобы эти отношения были первичным ключом

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

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

Здесь, в вашем случае, так как это один к одному, мыхорошо пойти.

Но вместо того, чтобы аннотировать Origin с помощью @Id.Аннотируйте внешний ключ с помощью @Id и используйте @MapsId, пока вы определяете отношение.

См. Пример кода ниже, где сведения о человеке и личности имеют отношение один к одному.

Сведения о человекесущность выглядит следующим образом:

@Entity
@Table(name = "person_details")
public class PersonDetails {

    @Id
    @Column(name = "person_details_Id")
    private Long personId;

     @Column(name = "person_name")
    private String personName;

    @OneToOne
    @JoinColumn(name = "person_Id")
    @MapsId
    private Person person;

    ...
}

сущность лица выглядит следующим образом:

@Entity
@Table(name = "person")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "person_seq")
    @Column(name = "person_id")
    private Long personId;

    @Column(name = "person_profsn")
    private String personProfession;

    @OneToOne(mappedBy = "person")
    private PersonDetails personDetails;

    ...
}
0 голосов
/ 15 октября 2018

Внешние ключи допускают дубликаты, которые в большинстве случаев делают их непригодными в качестве первичных ключей.Однако это не правило.

Единственным исключением из этого являются таблицы с отношением один к одному, где внешний ключ и первичный ключ связанной таблицы совпадают.

Я столкнулся с подобным сценарием и сделал что-то вроде этого,

@Entity
@Table(name = "PERSON_DETAILS")
public class PersonDetails {
    @Id
    private Long personId; 

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_PERSON", nullable = false)
    @MapsId
    private Person person;
    ....
}

@Entity
@Table(name = "PERSON")
@SequenceGenerator(name = "SQ_PRSN_ID", sequenceName = "SQ_PRSN_ID")
public class Person{
    @Id
    @GeneratedValue(generator = "SQ_PRSN_ID", strategy = GenerationType.SEQUENCE)
    @Column(name = "ID_PERSON", nullable = false)
    private Long personId;
    ...
}

Я нашел похожий пример здесь , надеюсь, это то, что вы ищете.

...