JPA: @ElementCollection и InheritanceType.TABLE_PER_CLASS -> повторяющееся имя столбца - PullRequest
2 голосов
/ 17 марта 2010

Я создал следующий сценарий:

@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class MyEntity implements Serializable{
    @Id
    @GeneratedValue
    protected Long id;
    ...
    @ElementCollection
    @CollectionTable(name="ENTITY_PARAMS")
    @MapKeyColumn (name = "ENTITY_KEY")
    @Column(name = "ENTITY_VALUE")
    protected Map<String, String> parameters;
    ...
}

А также:

@javax.persistence.Entity
public class Sensor extends MyEntity{
    @Id
    @GeneratedValue
    protected Long id;
    ...

    // so here "protected Map<String, String> parameters;" is inherited !!!!
    ...
}

Итак, при выполнении этого примера таблицы не создаются, и я получаю следующее сообщение:

WARNUNG: Got SQLException executing statement "CREATE TABLE ENTITY_PARAMS (Entity_ID BIGINT NOT NULL, ENTITY_VALUE VARCHAR(255), ENTITY_KEY VARCHAR(255), Sensor_ID BIGINT NOT NULL, ENTITY_VALUE VARCHAR(255))": com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Duplicate column name 'ENTITY_VALUE'

Я также пытался переопределить атрибуты класса Sensor ...

@AttributeOverrides({
    @AttributeOverride(name = "ENTITY_KEY", column = @Column(name = "SENSOR_KEY")),
    @AttributeOverride(name = "ENTITY_VALUE", column = @Column(name = "SENSOR_VALUE"))
})

... но та же ошибка.

EDIT:

Хорошо, я обнаружил, что со стратегией наследования "JOINED", а также с "SINGLE_TABLE" все работает отлично. Также кажется, что это не имеет ничего общего с версией EclipseLink - я пробовал 1.3 и 2.0.1.

END_EDIT

Кто-нибудь может мне помочь?

1 Ответ

6 голосов
/ 18 марта 2010

Хорошо, я только что узнал, что случилось!

В таком сценарии, который я построил, вы не могли использовать @ CollectionTable (name = "ENTITY_PARAMS") аннотацию.

Итак, просто используя ... @ElementCollection @MapKeyColumn (name = "PARAM_KEY") @Column (name = "PARAM_VALUE") приватные параметры карты;

Все отлично работает, и в результате таблицы (в MySQL):

CREATE TABLE Sensor_PARAMETERS (
    Sensor_ID BIGINT NOT NULL,
    PARAM_VALUE VARCHAR(255),
    PARAM_KEY VARCHAR(255)
)

и

CREATE TABLE Entity_PARAMETERS (
    Entity_ID BIGINT NOT NULL,
    PARAM_VALUE VARCHAR(255),
    PARAM_KEY VARCHAR(255)
)

Итак, без этого атрибута все работает нормально .... Надеюсь, этот пост никому не нужен. Даже если: «Поздравляю, вы нашли ответ!» ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...