Intereting Posts
responseText работает, но responseXML всегда имеет значение null Как выполнить внешнюю командную строку программного обеспечения Windows в php exec ()? Система регистрации PHP не будет работать (phpmyadmin, wampserver) Неустранимая ошибка: вызов неопределенной функции mb_strlen () Добавить переменную php внутри инструкции echo как адрес ссылки href? Перемещение строки из одной таблицы в другую (список значений вставки не соответствует списку столбцов) добавьте новый столбец для специальной цены в сетке на панели администратора в magento Вмешательство не изменяет размер больших файлов Почему filter_input () неполный? CSS: установите размер шрифта таким образом, чтобы текст занимал весь контейнер Ошибка загрузки api в Google Диске PHP: $ _SERVER против $ _SERVER Невозможно отправлять переменные с помощью jquery post () Как отображать только изображения из папки, начинающейся с буквы A? Неустранимая ошибка: вызов частного объекта MyObject :: __ () из недопустимого контекста

Может ли колонка дискриминатора быть частью первичного ключа в Doctrine2?

Я использую Single Table Inheritance в Doctrine2 для хранения учетных данных OAuth для нескольких служб. Я хотел бы использовать идентификатор службы как первичный ключ; однако это не уникально для всех служб.

Я установил базу данных для использования столбца дискриминатора и идентификатора службы в качестве первичного ключа, но я не могу найти способ заставить Doctrine использовать столбец дискриминатора в качестве ключа (в дополнение к столбцу дискриминатора). Я использую аннотации docblock, и если я добавлю столбец дискриминатора в качестве поля @Id, я получаю сообщение об ошибке:

Duplicate definition of column...in a field or discriminator column mapping. 

Если я определяю поле только как столбец дискриминатора, любые перекрывающиеся идентификаторы служб обновляют все соответствующие строки.

В любом случае, чтобы сделать эту работу, кроме как просто использовать ее автоматически генерируемую стоимость?

Solutions Collecting From Web of "Может ли колонка дискриминатора быть частью первичного ключа в Doctrine2?"

Вы не можете, колонка дискриминатора не может использоваться как часть первичного ключа.

Зачем вам STI для этого варианта использования? Вы должны создать один новый класс за один открытый сервис, который вы предоставляете, звучит довольно раздражающе 🙂

Для тех, кто использует Hibernate, вы можете (по крайней мере, от JPA 2.1). В моей среде работает следующий алгоритм работы (hibernate-entitymanager 4.3.6.Final):

 @Entity @Table(name = "CODIFICATIONS") @IdClass(CodificationId.class) @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = Codification.DISCRIMINATOR_COLUMN, discriminatorType = DiscriminatorType.INTEGER) public abstract class Codification implements Serializable { public static final String DISCRIMINATOR_COLUMN = "TABLE_ID"; private static final long serialVersionUID = 1L; @Column(name = "CODIFICATION_ID") protected Long codificationId; @Id @Column(name = DISCRIMINATOR_COLUMN, insertable = false, updatable = false) protected Long tableId; @Id @Column(name = "CODE_ID", insertable = false, updatable = false) protected Long codeId; @Column(name = "LONG_NAME") protected String longName; @Column(name = "SHORT_NAME") protected String shortName; } public class CodificationId implements Serializable { private static final long serialVersionUID = 1L; private Long tableId; private Long codeId; public Long getTableId() { return tableId; } public void setTableId(Long tableId) { this.tableId = tableId; } public Long getCodeId() { return codeId; } public void setCodeId(Long codeId) { this.codeId = codeId; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((tableId == null) ? 0 : tableId.hashCode()); result = prime * result + ((codeId == null) ? 0 : codeId.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; CodificationId other = (CodificationId) obj; if (tableId == null) { if (other.tableId != null) return false; } else if (!tableId.equals(other.tableId)) return false; if (codeId == null) { if (other.codeId != null) return false; } else if (!codeId.equals(other.codeId)) return false; return true; } } @Entity @DiscriminatorValue(Status.DISCRIMINATOR_VALUE) public class Status extends Codification { public static final String DISCRIMINATOR_VALUE = "2"; private static final long serialVersionUID = 1L; } 

Затем я настраиваю связь с Status со следующим кодом:

 @ManyToOne @JoinColumnsOrFormulas({ @JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = Codification.DISCRIMINATOR_COLUMN, value = Status.DISCRIMINATOR_VALUE)), @JoinColumnOrFormula(column = @JoinColumn(name = "STATUS", referencedColumnName = "CODE_ID")) }) private Status status;