我创建了以下场景:
@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
有人能帮助我吗?
答案 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)
)
所以,没有那个属性一切正常...... 希望,没有人需要这篇文章。即使:“祝贺你,你找到了答案!” ; - )