..別の「クラス階層ごとのテーブル」のサブクラスマッピングサブクラスを持つマップ「テーブルクラス階層ごとの」スーパークラスに
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
私のモデルは、スーパークラスとしてParameter
とParameterType
を持つ階層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();
あなたのマッピングを見てください。@Inheritance(strategy = InheritanceType.SINGLE_TABLE) –
不幸にも、この問題は修正されません。 [Hibernate javadocでのJPA @inheritance association](https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/Inheritance.html)に記載されているように、指定されていない場合のデフォルトタイプは –
情報のおかげで。それは知らなかった。 –