JPA:@ElementCollection和InheritanceType.TABLE_PER_CLASS - >列名重复

时间:2010-03-17 19:57:44

标签: java jpa

我创建了以下场景:

@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"))
})

......但是同样的错误。

修改

好的,我发现继承策略“JOINED”以及“SINGLE_TABLE”一切正常。 它似乎与EclipseLink版本无关 - 我尝试过1.3和2.0.1。

END_EDIT

有人能帮助我吗?

1 个答案:

答案 0 :(得分:6)

好的,我刚刚发现了什么问题!

在这种情况下我构建了你应该 使用 @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)
)

所以,没有那个属性一切正常...... 希望,没有人需要这篇文章。即使:“祝贺你,你找到了答案!” ; - )