Как обрабатывать в Hibernate несколько табличных сущностей, которые имеют один и тот же составной идентификатор в базе данных? - PullRequest
0 голосов
/ 25 мая 2019

Моя основная таблица имеет составной первичный ключ, где одно из полей является последовательностью.Он имеет отношение один к одному с двумя другими таблицами, где составной ключ является первичным / внешним ключом этих соответствующих таблиц.В моем коде Java у меня есть класс PK, который содержит @SequenceGenerator.Поскольку столбцы разделены между таблицами, я попытался, чтобы все мои сущности использовали один и тот же класс PK.Однако, поскольку в моем классе PK есть поле с @SequenceGenerator, всякий раз, когда я пытаюсь вставить его в таблицы внешнего ключа, hibernate генерирует дополнительную последовательность и завершается с ошибкой при вставке из-за отсутствия родительского ключа.

Так как @SequenceGenerator генерировал дополнительную последовательность для последующих вставок в другие таблицы, я клонировал свой класс PK для каждой другой таблицы и удалил @SequenceGenerator, чтобы столбцы были одинаковыми, и Hibernate не будет генерироватьновая последовательность во время вставки.Это, однако, создало еще одну проблему, когда hibernate ожидает другой класс PK, чем тот, который предоставляется.

public class AddrEntityPK implements Serializable {
    @Id
    private long addrTyId;
    @SequenceGenerator(name = "ADDR_SEQ", sequenceName = "ADDR_SEQ", allocationSize = 1)
    @GeneratedValue(generator = "ADDR_SEQ")
    private long addrSeqNum;
}

public class PhoneEntityPK implements Serializable {
    @Id
    private long addrTyId;
    @Id
    private long addrSeqNum;
}

public class ElecrMailEntityPK implements Serializable {
    @Id
    private long addrTyId;
    @Id
    private long addrSeqNum;
}

@Entity
@IdClass(AddrEntityPK.class)
public class AddrEntity {}

@Entity
@IdClass(PhoneEntityPK.class)
public class PhoneEntity {}

@Entity
@IdClass(ElecrMailEntityPK.class)
public class ElecrMailEntity {}

Поскольку имена столбцов совпадают, я бы ожидал, что hibernate не сгенерирует исключение, а вместо этого выдает org.hibernate.TypeMismatchException: Provide id of the wrong type for class AddrEntity. Expected AddrEntityPK, got class PhoneEntityPK

...