Я пытаюсь использовать отношение ManyToOne, где внешний ключ ссылается на поле @Embedded в целевом классе.Это хорошо компилируется и улучшается, но при запуске этого кода OpenJPA будет жаловаться на исключение.Это с OpenJPA 2.0.1.В коде это выглядит так:
@Embeddable
public class NormalizedNumber {
private String normalizedNumber;
@Basic
public String getNormalizedNumber() {
return normalizedNumber;
}
/* ... */
}
@Entity
@Table(name = "Phones")
public class Phone {
private String key;
private NormalizedNumber normalizedNumber;
@Id
@Column(name = "IdKey", nullable = false)
protected String getKey() {
return key;
}
@Embedded
public NormalizedNumber getNormalizedNumber() {
return normalizedNumber;
}
/* ... */
}
@Entity
@Table(name = "UsersPhones")
public class UserPhone {
private String key;
private Phone device;
@Id
@Column(name = "IdKey", nullable = false)
protected String getKey() {
return key;
}
@ManyToOne
@JoinColumn(name="DeviceId", referencedColumnName="NormalizedNumber")
public Phone getDevice() {
return this.device;
}
}
Соответствующая схема базы данных для MySQL:
create table Phones (
IdKey CHAR(32) BINARY,
-- type discriminator (inheritance strategy is single table)
UDType CHAR(2) BINARY,
NormalizedNumber VARCHAR(100) BINARY NOT NULL,
-- more columns here
constraint Phones_PK primary key (IdKey) );
create table UsersPhones (
IdKey CHAR(32) BINARY,
DeviceId VARCHAR(100) BINARY NOT NULL,
UserKey CHAR(32) BINARY,
-- more columns here
constraint UsersPhones_PK primary key (IdKey) );
Здесь происходит следующее.У меня есть класс Phone
, который встраивает класс NormalizedNumber
.normalizedNumber
- это не первичный ключ и не @Id
класса.Он имеет другое поле key
как @Id
.Класс
A UserPhone
имеет ссылку на класс Phone
.Это отношение @ManyToOne
, поскольку многие пользователи могут использовать один и тот же телефон.Таблица UsersPhones
не использует первичный ключ таблицы Phones
в качестве внешнего ключа, а столбец NormalizedNumber
.Очевидно, это может быть недопустимо в JPA, но в руководстве OpenJPA говорится, что OpenJPA поддерживает объединения, где целевой столбец не является первичным ключом «с тем же синтаксисом, что и соединение первичного ключа».
Из руководства я понял, что это также будет работать со встроенными полями.Но я полагаю, что, должно быть, неправильно истолковал это, потому что это не так.Это исключение, которое я получаю:
«Вы не можете присоединиться к столбцу« Phones.normalizedNumber ». Он не управляется сопоставлением, поддерживающим объединения.»
Я прошел через OpenJPA сотладчик на два дня, чтобы найти подсказку, если я что-то делаю неправильно или если это просто не законно, потому что я не нахожу это явно описанным в какой-либо документации.Я нашел подсказку в Javadoc в том, что EmbedFieldStrategy
OpenJPA не реализует Joinable
.Поэтому, возможно, я пытаюсь сделать невозможное.
Отсюда вопрос к экспертам: это разрешено?Или может ли цель отношения не быть встроенным полем (кроме @EmbeddedId, я полагаю)?
Могу ли я переопределить встроенный NormalizedNumber
, чтобы определить normaizedNumber как @Id
?