OpenJPA: Может ли цель отношения ManyToOne быть полем @Embedded? - PullRequest
2 голосов
/ 18 ноября 2010

Я пытаюсь использовать отношение 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?

...