2017-12-13 15 views
0

@Entityアノテーションを使用してSpringでテーブルを作成しようとしていますが、マップフィールドを指すエラーが発生しています。可能であれば、これらのフィールドがすべて含まれているテーブルを作成し、可能でない場合はvalidationGroupフィールドのみを作成します。Java Spring Javaクラスからデータベーステーブルを作成すると、BeanCreationExceptionが発生します。

私はテーブルを作成したいクラス:

@Entity 
public class StatementDocument { 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 

@JsonProperty("text") 
private String text; 

@JsonProperty("statementMap") 
private Map<String, AggregatedStatement> statementMap; 

@JsonProperty("fields") 
private Map<String, String> fields; 

@JsonProperty("validationGroup") 
private String validationGroup; 

public StatementDocument(@JsonProperty("text")String text, 
         @JsonProperty("statementMap")Map<String, AggregatedStatement> statementMap) { 
    this.text = text; 
    this.statementMap = statementMap; 
} 

@JsonCreator 
public StatementDocument(@JsonProperty("text")String text, 
         @JsonProperty("statementMap")Map<String, AggregatedStatement> statementMap, 
         @JsonProperty("fields") Map<String,String> fields, 
         @JsonProperty("validationGroup") String validationGroup) { 
    this.text = text; 
    this.statementMap = statementMap; 
    this.fields = fields; 
    this.validationGroup=validationGroup; 
} 

public String getText() { 
    return text; 
} 

public Map<String, AggregatedStatement> getStatementMap() { 
    return statementMap; 
} 

public void setText(String text) { 
    this.text = text; 
} 

public void setStatementMap(Map<String, AggregatedStatement> statementMap) { 
    this.statementMap = statementMap; 
} 

public void addField(String key, String value) { 
    if (fields == null){ 
     fields = new HashMap<>(); 
    } 
    fields.put(key, value); 
} 

public String getField(String key) { 
    return fields.get(key); 
} 

public Map<String, String> getFields() { 
    return fields; 
} 

public void setFields(Map<String, String> fields) { 
    this.fields = fields; 
} 

@Override 
public String toString() { 
    return "StatementDocument{" + 
      "text='" + text + '\'' + 
      ", statementMap=" + statementMap + 
      ", fields=" + fields + 
      '}'; 
} 

エラーIAMが取得は次のとおりです。

org.hibernate.MappingException: Could not determine type for: java.util.Map, at table: statement_document, for columns: [org.hibernate.mapping.Column(fields)] 

Fullstackトレース:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1078) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE] 
    at com.ibm.fk.textanalys.App.main(App.java:11) [classes/:na] 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370) ~[spring-orm-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359) ~[spring-orm-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    ... 16 common frames omitted 
Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Map, at table: statement_document, for columns: [org.hibernate.mapping.Column(fields)] 
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:431) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:398) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.mapping.Property.isValid(Property.java:225) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:595) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:265) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 
    ... 22 common frames omitted 

アップデート1:

私はサイモンマルティネリがテーブルに作成されることから、いくつかのフィールドを除くために提供さ答えを受け入れました。

アップデート2:

私はStatementDocumentクラスのマップのデータ型を持つフィールドを含むと一緒に行くことにしました。 IamはAggregatedStatementのクラスを提供して、リレーショナルマッピングの助けを得ることができます。

public class AggregatedStatement { 

    @JsonProperty("statements") 
    private final List<Statement> statements; 

    @JsonProperty("outcome") 
    private final String outcome; 

    public AggregatedStatement(@JsonProperty("statements") List<Statement> statements, 
      @JsonProperty("outcome") String outcome) { 
     this.statements = statements; 
     this.outcome = outcome; 
    } 

    public List<Statement> getStatements() { 
     return statements; 
    } 

    public String getOutcome() { 
     return outcome; 
    } 

} 
+0

Map型のフィールドでは、どのようなデータベースタイプが必要ですか? –

+0

私は文字列を期待します – Genesis

+0

マップから文字列へのマッピングはどのように見えると思いますか? –

答えて

1

マップの属性は、@ ManyToOne/@ OnToOneまたは@OneToManyのいずれかの関係にする必要があります。 @OneToMany

@OneToMany 
@MapKey(name = "title") 
@JsonProperty("statementMap") 
private Map<String, AggregatedStatement> statementMap; 

MapKeyと

例は、マップ内のキーとして使用されるべきであるAggregatedStatementのフィールドです。属性の除外についてのコメント後に編集

あなたは@Transient注釈使用するエンティティのいくつかの属性を除外したい場合:

@Entity 
public class StatementDocument { 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 

@JsonProperty("text") 
private String text; 

@Transient 
@JsonProperty("statementMap") 
private Map<String, AggregatedStatement> statementMap; 

@Transient 
@JsonProperty("fields") 
private Map<String, String> fields; 

@JsonProperty("validationGroup") 
private String validationGroup; 
... 
+0

AggregatedStatementの各フィールドに@Mapkeyが必要ですか? – Genesis

+0

「text」と「ValidationGroup」という2つのフィールドしか持たないテーブルを作成したいのですが、データ型マップを持つフィールドを除外するにはどうすればいいですか? – Genesis

+0

私はこれを私の答えに加えました –

0

を私がいけないのフィールドを除いて試してみましたうまく動作しているテーブルに作成したい。私は、アノテーション@OneToMany、@ManyToOne、@ElementCollectonで試してみましたが、それでも、それは仕事をdoesntの

@JsonProperty("statementMap") 
private Map<String, AggregatedStatement> statementMap; 

@JsonProperty("fields") 
private Map<String, String> fields; 

:IAMが今している地図のデータ型を持つフィールドを含めるしようとしています。 @OneToManyまたは@ManyToOneで注釈を付けた後に追加するものがありますか?

関連する問題