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

ger*_*rry 2 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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

以及:

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

    // so here "protected Map<String, String> parameters;" is inherited !!!!
    ...
}
Run Code Online (Sandbox Code Playgroud)

所以运行这个例子,没有创建表,我收到以下消息:

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'
Run Code Online (Sandbox Code Playgroud)

我也试过覆盖Sensor类的属性......

@AttributeOverrides({
    @AttributeOverride(name = "ENTITY_KEY", column = @Column(name = "SENSOR_KEY")),
    @AttributeOverride(name = "ENTITY_VALUE", column = @Column(name = "SENSOR_VALUE"))
})
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

END_EDIT

有谁能够帮我?

ger*_*rry 6

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

在我构建的这种场景中,你应该不能使用@CollectionTable(name ="ENTITY_PARAMS")注释.

所以,只需使用... @ElementCollection @MapKeyColumn(name ="PARAM_KEY")@Column(name ="PARAM_VALUE")私有Map参数;

每个工作正常,结果表(在MySQL中)是:

CREATE TABLE Sensor_PARAMETERS (
    Sensor_ID BIGINT NOT NULL,
    PARAM_VALUE VARCHAR(255),
    PARAM_KEY VARCHAR(255)
)
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE Entity_PARAMETERS (
    Entity_ID BIGINT NOT NULL,
    PARAM_VALUE VARCHAR(255),
    PARAM_KEY VARCHAR(255)
)
Run Code Online (Sandbox Code Playgroud)

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