Java Spring从java类创建数据库表会产生BeanCreationException

问题描述 投票:0回答:2

我试图用@Entity注释创建一个带弹簧的表,但是我得到指向Map字段的错误。我想要一个包含所有这些字段的表,如果可能的话,如果不可能,那么只有validationGroup字段。

我想为下面创建一个表的类:

@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 +
            '}';
}

我得到的错误是:

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

完整堆栈跟踪:

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:

我接受了Simon Martinelli提供的排除某些字段在表格中创建的答案。

更新2:

我决定在StatementDocument类中包含map数据类型的字段。我将为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;
    }

}
java database spring
2个回答
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
投票

我已经尝试排除了我不想在表格中创建的字段,这些字段已经正常工作。 Iam现在尝试包含数据类型为Map的字段:

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

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

我已经尝试使用注释@OneToMany,@ ManyToOne,@ ElementCollecton,但它仍然无法正常工作。在使用@OneToMany或@ManyToOne进行注释后还有更多内容需要添加吗?

© www.soinside.com 2019 - 2024. All rights reserved.