2010-03-17 43 views
2

我創建了以下情形列名:JPA:@ElementCollection和InheritanceType.TABLE_PER_CLASS - >複製

@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' 

我也嘗試覆蓋Sens上的屬性或類...

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

......但同樣的錯誤。

編輯:

好吧,我已經發現,與「聯合」,以及與繼承策略「SINGLE_TABLE」一切工作正常。此外,它似乎與EclipseLink版本無關 - 我試過1.3和2.0.1。

END_EDIT

任何人可以幫助我嗎?

回答

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) 
) 

所以,沒有這個屬性一切正常.... 希望,沒有人需要這個帖子。即使:「恭喜,你找到了答案!」 ;-)