将Springboot MVC Java应用程序设置为UPDATE时无法运行

西布斯库斯

在决定添加评论之前,我的Web应用程序一直在运行。我搞砸了很多,所以我spring.jpa.hibernate.ddl-auto更改upatecreate-drop但是现在,当我spring.jpa.hibernate.ddl-auto = create-drop启动应用程序并将其更改为时,出现spring.jpa.hibernate.ddl-auto = update以下错误:

2017-11-27 15:27:02.481 ERROR 3552 --- [  restartedMain] o.s.boot.SpringApplication               : Application startup failed

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 blog.BlogApplication.main(BlogApplication.java:14) [classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_111]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_111]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_111]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_111]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-1.5.8.RELEASE.jar:1.5.8.RELEASE]
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]
    ... 21 common frames omitted
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Unable to execute schema management to JDBC target [alter table comments add constraint FK99rehd3fcds7jsy5dpa39fitm foreign key (comments) references users (id)]
    at org.hibernate.tool.schema.internal.TargetDatabaseImpl.accept(TargetDatabaseImpl.java:59) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlString(SchemaMigratorImpl.java:431) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlStrings(SchemaMigratorImpl.java:420) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applyForeignKeys(SchemaMigratorImpl.java:386) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigrationToTargets(SchemaMigratorImpl.java:214) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:60) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:134) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:101) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:472) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[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]
    ... 27 common frames omitted
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: BLOB/TEXT column 'comments' used in key specification without a key length
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_111]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_111]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_111]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_111]
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2483) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1552) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2607) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1480) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_111]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_111]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_111]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_111]
    at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) ~[tomcat-jdbc-8.5.23.jar:na]
    at com.sun.proxy.$Proxy88.executeUpdate(Unknown Source) ~[na:na]
    at org.hibernate.tool.schema.internal.TargetDatabaseImpl.accept(TargetDatabaseImpl.java:56) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    ... 37 common frames omitted

我的某些关系可能混乱了,但是我有一个ArticleBindingModel

public class ArticleBindingModel
{    
    private String comments;

    @NotNull
    private String title;
    @NotNull
    private String content;

    //--------------------------GETTERS/SETTERS---------------------------
    public String getTitle()
    {
        return title;
    }

    public void setTitle(String title)
    {
        this.title = title;
    }

    public String getContent()
    {
        return content;
    }

    public void setContent(String content)
    {
        this.content = content;
    }

    public String getComments()
    {
        return comments;
    }

    public void setComments(String comments)
    {
        this.comments = comments;
    }
}

文章实体

@Entity
@Table(name = "articles")
public class Article
{
    private Integer id;
    private String title;
    private String content;

    private User author;
    private User commenter;

    private Set<Comment> comments;


    //-----------------------------CONSTRUCTORS--------------------------
    public Article(String title, String content, User author)
    {
        this.title = title;
        this.content = content;
        this.author = author;

        this.comments = new HashSet<>();
    }
    public Article(){}

    //-------------------------GETTERS/SETTERS----------------------------
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId()
    {
        return id;
    }

    public void setId(Integer id)
    {
        this.id = id;
    }

    @Column(nullable = false)
    public String getTitle()
    {
        return title;
    }

    public void setTitle(String title)
    {
        this.title = title;
    }

    @Column(columnDefinition = "text", nullable = false)
    public String getContent()
    {
        return content;
    }

    public void setContent(String content)
    {
        this.content = content;
    }

    @ManyToOne()
    @JoinColumn(nullable = false, name = "authorId")
    public User getAuthor()
    {
        return author;
    }

    public void setAuthor(User author)
    {
        this.author = author;
    }   

    @OneToMany(mappedBy = "article")
    public Set<Comment> getComments()
    {
        return comments;
    }

    public void setComments(Set<Comment> comments)
    {
        this.comments = comments;
    }     
}

评论实体

@Entity
@Table(name = "comments")
public class Comment
{

    private Integer id;
    private User commenter;
    private String comments;
    private Article article;

    //-----------------------------CONSTRUCTORS----------------------

    public Comment(User commenter, String comments, Article article)
    {
        this.commenter = commenter;
        this.comments = comments;
        this.article = article;
    }

    public Comment(){}

    //----------------------METHODS-----------------------------------


    //--------------------GETTERS/SETTERS-----------------------------

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId()
    {
        return id;
    }

    public void setId(Integer id)
    {
        this.id = id;
    }

    @Column(nullable = false, columnDefinition = "LONGBLOB")
    public String getComments()
    {
        return comments;
    }

    public void setComments(String comments)
    {
        this.comments = comments;
    }

    @ManyToOne()
    @JoinColumn(nullable = false, name = "commenterId")
    public User getCommenter()
    {
        return commenter;
    }

    public void setCommenter(User commenter)
    {
        this.commenter = commenter;
    }

    @ManyToOne()
    @JoinColumn(nullable = false, name = "articleId")
    public Article getArticle()
    {
        return article;
    }

    public void setArticle(Article article)
    {
        this.article = article;
    }

}

用户实体

@Entity
@Table(name = "users")
public class User
{
private Integer id;
private String username;

private Set<Article> articles;
private Set<Comment> comments;

//-----------------------------------CONSTRUCTORS-----------------------------------
public User (String username)
{
    this.username = username;  

    this.articles = new HashSet<>();
    this.comments = new HashSet<>();
}
public User() {

}
//------------------------------------METHODS------------------------------------------
//----------------------------------GETTERS/SETTERS--------------------------------------
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId()
{
    return id;
}

public void setId(Integer id)
{
    this.id = id;
}


@Column(name = "username", length = 80, nullable = false, unique = true)
public String getUsername()
{
    return username;
}

public void setUsername(String username)
{
    this.username = username;
}

@OneToMany(mappedBy = "author")
public Set<Article> getArticles()
{
    return articles;
}

public void setArticles(Set<Article> articles)
{
    this.articles = articles;
}


@OneToMany(mappedBy = "comments")
public Set<Comment> getComments()
{
    return comments;
}

public void setComments(Set<Comment> comments)
{
    this.comments = comments;
}
}

然后,我有一个适当实体的存储库。我已经对代码进行了大量的编辑,所以我不会成为“ heresallmycode”的家伙。但是,我很确定我的注释关系是问题所在。我希望有一个与文章具有“一对多”关系的评论,一个发布时会出现在评论上方的用户,以及与评论具有反向“一对多”关系的用户。使用create参数创建表时,没有清空我的articles表(update之前已经打开过),我不得不手动将其删除。现在,创建表后,它为空。我认为这值得一提。create如果需要,我可以发布日志。

编辑

我忘记了我的ArticleController

@Controller
public class ArticleController
{
    @Autowired
    private ArticleRepository articleRepository;
    @Autowired
    private UserRepository userRepository;
    @Autowired  
    private CommentRepository commentRepository;



    //---------------------------------METHODS-----------------------

    //ARTICLE DETAILS--------------------------------------------------
    @GetMapping("/article/{id}")
    public String details(Model model, @PathVariable Integer id)
    {
        if (!this.articleRepository.exists(id))
        {
            return "redirect:/";
        }
        UserDetails principal = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();//This was inside the IF
        if (!(SecurityContextHolder.getContext().getAuthentication() instanceof AnonymousAuthenticationToken))
        {
            User entityUser = this.userRepository.findByEmail(principal.getUsername());

            model.addAttribute("user", entityUser);
        }
        //Getting the article
        Article article = this.articleRepository.findOne(id);

        //Comments
        Set<Comment> comments = this.commentRepository.findCommentsByArticleId(id);//findAllByArticlesId
        //Set<User> commenters = this.userRepository.findAllByComments(comments);



        //Models
        model.addAttribute("article", article);
        //model.addAttribute("commenters", commenters);
        model.addAttribute("comments", comments);

        model.addAttribute("view", "article/details");

        return "base-layout";
    }

    @PostMapping("/article/{id}")
    @PreAuthorize("isAuthenticated()")
    public String detailsProcess(@PathVariable Integer id, ArticleBindingModel articleBindingModel)
    {
        if (!this.articleRepository.exists(id))
        {
            return "redirect:/";
        }
        //Getting the article
        Article article = this.articleRepository.findOne(id);

        //Getting the commenter
        UserDetails principal = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        User commenter = this.userRepository.findByEmail(principal.getUsername());

        //Setting the values for the comment section


        return "redirect:/article/{id}";
    }
}
麦琪(Maciej Kowalski)

您已在Comment中将与User的关系定义为:

@ManyToOne()
@JoinColumn(nullable = false, name = "commenterId")
public User getCommenter()
{
    return commenter;
}

但您指的是关系一侧的comments字符串列Comment您应该将更mappedBy改为:

@OneToMany(mappedBy = "commenter")
public Set<Comment> getComments()
{
    return comments;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SpringBoot Web MVC应用程序无法解析视图

将ASP MVC Web应用程序作为桌面应用程序运行

在已经将spring-mvc用作依赖项的应用程序中设置spring-mvc

带有 MongoDB 的 MVC SpringBoot 应用程序

如何引导SpringBoot应用程序(不带mvc)?

当SpringBoot应用程序请求ElasticSearch时,是否可以将所有索引数据搜索上的Fuzzy参数设置为应用程序参数?

无法运行SpringBoot应用程序

无法将Selenium RemoteWebDriver与docker-compose结合使用来运行Springboot应用程序

将应用程序安装到设备Xcode 11.6时无法运行应用程序错误

为什么当我将图像设置为 ImageView 并在 android 7.1.1 上运行它时应用程序崩溃

使用mvc4将图像显示为移动应用程序的幻灯片

SelectListItem /将应用程序窗体MVC3 4.0更新为MVC5 4.5.1 /视图扩展方法

将应用程序设置为默认应用程序

将Visual Studio MVC应用程序调试到Chrome时出现“ spawn UNKNOWN”错误

将MVC应用程序部署到Azure App Service时的POSTS问题

使用angular时如何将视图加载到MVC应用程序中

尝试将 Twilio 集成到 .NET Core MVC 应用程序中时出错

是否可以将VSCode集成终端设置为运行Mac Shell程序的默认应用程序?

Web应用程序将无法运行

将stimulsoft集成到MVC4应用程序

将MVC应用程序部署到IIS 7.5

将MVC 5降级为MVC 4

当页面加载MVC时,将Dropdown值设置为null

如何从Java IDE为专业开发人员(IntelliJ IDEA)运行SpringBoot应用程序

如何将某些应用程序设置为仅以root身份运行

将MVC网站作为应用程序部署到MVC网站中

如何将多个MVC.net应用程序与其他MVC.net应用程序连接?

无法运行 springboot 应用程序,得到 OptimisticLockException

将ASP.NET MVC标准应用程序转换为N层应用程序