2016-10-13 8 views
0
長いタイトルのために申し訳ありません

..別の「クラス階層ごとのテーブル」のサブクラスマッピングサブクラスを持つマップ「テーブルクラス階層ごとの」スーパークラスに

TableColumnエンティティ問い合わせるときに、私は次のエラーを持っている:

フィールド値を設定できませんでした [[email protected]] 反射による値:[クラスorg.comp.data.AnalogParameter.analogParameterType] org.comp.data.AnalogParameter.analogParameterTypeの セッター。ネストされた 例外org.hibernate.PropertyAccessExceptionある: 反射によってフィールド値[[email protected]]の値を設定できませんでした: の[クラス org.comp.domain.data.AnalogParameter.analogParameterType]セッターorg.comp.domain.data.AnalogParameter.analogParameterType

私のモデルは、スーパークラスとしてParameterParameterTypeを持つ階層2 distincts「クラスごとに単一のテーブル」が含まれています。 Parameter階層の各サブクラスは、ParameterType階層のサブクラスと、@ManyToOneの関連付けによってマッピングされます。ここ は、関与するエンティティ(省略さ無関係なフィールド)と私のモデルの抽出物である:ここで

// `Parameter` Single Table Per Class hierarchy 

@Entity 
@Table(name="parameters") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "category", discriminatorType = DiscriminatorType.STRING) 

@DiscriminatorOptions(force=true) 
public abstract class Parameter { 

} 

@Entity 
@DiscriminatorValue(value="analog") 
public class AnalogParameter extends Parameter { 

    @ManyToOne 
    @JoinColumn(name="parameter_type_id") 
    private AnalogParameterType analogParameterType; 

    public AnalogParameterType getAnalogParameterType() { 
     return analogParameterType; 
    } 

    public void setAnalogParameterType(AnalogParameterType analogParameterType) { 
     this.analogParameterType = analogParameterType; 
    } 


} 

@Entity 
@DiscriminatorValue(value="constant") 
public class ConstantParameter extends Parameter { 

    @ManyToOne 
    @JoinColumn(name="parameter_type_id") 
    private ConstantParameterType constantParameterType; 

    public ConstantParameterType getConstantParameterType() { 
     return constantParameterType; 
    } 

    public void setConstantParameterType(ConstantParameterType constantParameterType) { 
     this.constantParameterType = constantParameterType; 
    } 

} 

// `ParameterType` Single Table Per Class hierarchy 

@Entity 
@Table(name="parameters_types") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "category", discriminatorType = DiscriminatorType.STRING) 

@DiscriminatorOptions(force=true) 
public abstract class ParameterType { } 

@Entity 
@DiscriminatorValue(value="analog") 
public class AnalogParameterType extends ParameterType { } 

@Entity 
@DiscriminatorValue(value="constant") 
public class ConstantParameterType extends ParameterType { 

} 

は@ManyToOne協会を通じてパラメータのスーパークラスでマッピングされているTableColumnのです。

@Entity 
@Table(name="tables_columns") 
public class TableColumn { 

    @ManyToOne 
    @JoinColumn(name="parameter_id") 
    private Parameter parameter; 

    public Parameter getParameter() { 
     return parameter; 
    } 
} 

そしてここにはあります

はid1_12_0_としてtablecolum0_.id選択し、 created_2_12_0としてtablecolum0_.created_atを:TableColumnのエンティティを照会生成されるSQL _、is_optio3_12_0_、paramete6_12_0_として tablecolum0_.parameter_id、 position4_12_0_、updated_5_12_0_としてtablecolum0_.updated_at、id2_8_1_として parameter1_.id、category1_8_1_としてparameter1_.category、created_3_8_1_として parameter1_.created_at、parameter1_としてtablecolum0_.positionとしてtablecolum0_.is_optional。 device_14_8_1_、effectiv4_8_1_としてparameter1_.effective_date、expiry_d5_8_1_として parameter1_.expiry_date、resolut10_8_1_として fqn6_8_1_、height_f7_8_1_としてparameter1_.height_from_the_ground、label8_8_1_として parameter1_.label、name9_8_1_としてparameter1_.name、 parameter1_.resolution_labelとしてparameter1_.fqnとしてDEVICE_ID 、parameter1_updated_at updated11_8_1_、parameter1_.paramete paramet15_8_1_としてr_type_id、data_va12_8_1_として parameter1_.data_validity_period、resolut13_8_1_として parameter1_.resolution、id1_1_2_としてdevice2_.id、created_2_1_2_として device2_.created_atは、 label4_1_2_としてdevice_t8_1_2_、fqn3_1_2_としてdevice2_.fqn、device2_.labelとしてdevice2_.device_type_id 、name5_1_2_としてdevice2_.nameは、 notes6_1_2_、parent_d9_1_2_としてdevice2_.parent_device_id、plant_i10_1_2_として device2_.plant_id、device2_.updated_atとして updated_7_1_2_としてdevice2_.notes created_3_9_3_、constantpa3_.descriptionとして constantpa3_.created_at、id2_9_3_としてconstantpa3_.id descript4_9_3_として、 constantpa3_.is_signed is_signe5_9_3_、constantpa3_.labelとして label6_9_3_、constantpa3_.nameをname7_9_3_、constantpa3_とします。tables_columnsからupdated_8_9_3_として updated_atのparameter1_.parameter_type_id = constantpa3_.idにparameters_types constantpa3_に参加tablecolum0_.parameter_id = parameter1_.id 左外部結合装置はparameter1_.device_id = device2_.id 左外側にdevice2_に パラメータparameter1_を外部結合左tablecolum0_どこtablecolum0_.id = 1

私は春のブートでのMySQLを使ったHibernate 5.0.11を使用しています1.4.1 /データレストプロジェクト

EDIT

同じデータベースを使ってバニラのMaven/Hibernateプロジェクトを試しました。私は同じエラーがあります。私が直接Parameterオブジェクトを照会した場合、それはOKですが、私はTableColumnを照会すると、私はエラーを取得:

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("org.hibernate.tutorial.jpa"); 
    EntityManager entityManager = entityManagerFactory.createEntityManager(); 
    entityManager.getTransaction().begin(); 

    // The following works 
    List<Parameter> ps = entityManager.createQuery("from Parameter", Parameter.class).getResultList(); 
    for (Parameter p: ps) { 
     System.out.println(p); 
    } 

    // But if i replace with following, i get the same error as reported 
    // in the beginning of this question 
    List<TableColumn> tcs = entityManager.createQuery("from TableColumn", TableColumn.class).getResultList(); 
    for (TableColumn tc: tcs) { 
     System.out.println(tc); 
    } 


    entityManager.getTransaction().commit(); 
    entityManager.close(); 
+0

あなたのマッピングを見てください。@Inheritance(strategy = InheritanceType.SINGLE_TABLE) –

+0

不幸にも、この問題は修正されません。 [Hibernate javadocでのJPA @inheritance association](https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/Inheritance.html)に記載されているように、指定されていない場合のデフォルトタイプは –

+0

情報のおかげで。それは知らなかった。 –

答えて

0

1)あなたcategorysize=7のですが、8 charactersすなわち、constant

の値を設定しています
@DiscriminatorColumn(name="category", length=7)//change to more than 7 

@DiscriminatorValue(value="constant")//here the length is 8

あなたは弁別COLについては、以下のコードを使用することができます、ので、 UMN:

@DiscriminatorColumn(name = "category", discriminatorType = DiscriminatorType.STRING)//no need of length attribute 

2)を使用すると、setterメソッドとgetterメソッドの下に持ってprivate AnalogParameterType analogParameterType;プロパティのためにそれを確認してください。

//setter  
public void setAnalogParameterType(AnalogParameterType analogParameterType) { 
    this.analogParameterType = analogParameterType; 
} 
//getter 
public AnalogParameterType getAnalogParameterType() { 
    return analogParameterType; 
} 

3)代わりゲッターに使用@ManyToOne(cascade=CascadeType.ALL) @ManyToOne @JoinColumn(name="parameter_type_id")


します。例えば

@ManyToOne(cascade = CascadeType.ALL) 
public AnalogParameterType getAnalogParameterType() { 
    return analogParameterType; 
} 
+0

それは良いキャッチだけど、不幸にも私の問題を解決しません。 @DiscriminatorColumnをあなたの提案に置き換えて、質問を編集しました。ありがとう –

+0

あなたのセッターとゲッターコードも追加してください。 –

+0

アクセサがあります。私は質問に(実際のコードからコピー貼り付けを介して) –

0

だから私は、偽=更新可能/挿入可能で2つのスーパーParameterParameterTypeをマッピングすることによって、私の問題を解決:

@Entity 
@Table(name="parameters") 
@DiscriminatorColumn(name = "category", discriminatorType = DiscriminatorType.STRING) 
@DiscriminatorOptions(force=true) 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public abstract class Parameter { 

    @ManyToOne 
    @JoinColumn(name="parameter_type_id", insertable = false, updatable = false) 
    private ParameterType parameterType; 

} 

スーパークラスで関連付けを強制することが表示されますレベルはトリックを行います。私はそれが純粋な副作用かデザインの必要性かどうかはわかりません。私は主題について何らの資源も見つけていない。

関連する問題