Mysql 使用springjpa/vaadin访问关系数据库

Mysql 使用springjpa/vaadin访问关系数据库,mysql,spring,spring-boot,hibernate,jpa,Mysql,Spring,Spring Boot,Hibernate,Jpa,我在mysql中设置了一个数据库,其中包含两个表: 股票信息 股票价格数据: 第一个表的主键设置为“Ticker”,第二个表的外键也指第一个表中的“Ticker”,表示一对多关系 我正在尝试使用spring数据在vaadin web应用程序中访问此数据。我尝试使用服务、存储库和两个从AbstractEntity扩展的实体从表中提取所有数据。但是,我在运行时收到以下错误: org.springframework.beans.factory.BeanCreationException: Err

我在mysql中设置了一个数据库,其中包含两个表:

股票信息

股票价格数据:

第一个表的主键设置为“Ticker”,第二个表的外键也指第一个表中的“Ticker”,表示一对多关系

我正在尝试使用spring数据在vaadin web应用程序中访问此数据。我尝试使用服务、存储库和两个从
AbstractEntity
扩展的实体从表中提取所有数据。但是,我在运行时收到以下错误:


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stockPriceRepository' defined in com.stockmachine.v2.backend.repository.StockPriceRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is ...
这显然与我对一对多关系的引用/映射有关,但在谷歌搜索了一段时间后,我仍然找不到解决方案

以下是我的实体类:

package com.stockmachine.v2.backend.entity;

import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

@Entity
@Table (name="stock_info")
public class Stock extends AbstractEntity implements Cloneable {
    //@Id
    //private String Ticker;
    @ManyToOne
    @JoinColumn(name = "Ticker")
    //private StockPrice stockPrice;
    
    private String Region;

    private String Sector;
    
    private String Industry;
    
    private String Type;
    
    /*public String getTicker() {
        return Ticker;
    }
    public void setTicker(String ticker) {
        Ticker = ticker;
    }*/
    
    public String getRegion() {
        return Region;
    }
    public void setRegion(String region) {
        Region = region;
    }
    public String getSector() {
        return Sector;
    }
    public void setSector(String sector) {
        Sector = sector;
    }
    public String getIndustry() {
        return Industry;
    }
    public void setIndustry(String industry) {
        Industry = industry;
    }
    public String getType() {
        return Type;
    }
    public void setType(String type) {
        Type = type;
    }
    
    

}
编辑
由于这些建议,我决定完全删除抽象实体,并对实体类进行如下更改:
public class Stock implements Cloneable {
    @OneToMany(mappedBy="stock", fetch=FetchType.LAZY, 
cascade=CascadeType.ALL)
    @Id
    private List<StockPrice> Ticker;
    private String Price;
    ...
     
    public List<StockPrice> getTicker() {
        return Ticker;
    }
    public void setTicker(List<StockPrice> ticker) {
        Ticker = ticker;
    }

公共类股票价格{
@许多酮
@JoinColumn(name=“Ticker”)
私人股票价格;
私人标价;
...

我认为该错误表明,
私人双倍价格
需要是一个集合,因为它与StockPrice存在@OneToMany关系。您可以通过使用以下列表来解决此问题:

private List<Double> Price;
私人标价;
或一套:

private Set<Double> Price;
私人定价;

在您的股票实体上,您应该将集合映射到您的股票价格实体,并且这种关系应该是双向的,比如:

public class Stock extends AbstractEntity  {
@OneToMany(mappedBy="stock", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
/*@JoinColumn(name = "Ticker") <- Don't use this, let hibernate figure this out by the 'mappedBy' */
private List<StockPrice> Price;
(...)

但是请记住,您的股票价格不能仅仅扩展您的AbstractEntity,因为它有一个复合键

谢谢!这修复了其中一个错误,但我仍然收到以下消息:
由以下原因引起:
是的,这与您的代码是不同的问题。我建议您查看本教程,了解如何实现映射:是否最好完全删除AbstractEntity?或者从我的sql表中删除外键?如果您希望将此关系作为OneOmany,我想是最好的方法是删除AbstractEntity,因为它的唯一目的是定义一个主键,该主键并不完全适用于其中一个实体。但这只是个人偏好的问题……尝试在股票价格上添加一个不同的@Id,但仍然保留“ticker”列以参考股票,这是你的游乐场:)谢谢,也许吧这是一个愚蠢的问题,但您已经将价格设置为
列表
部分的意义是什么?StockPrice显然是实体类,但这与我们的列表有什么关系?对于每个股票代码值,都有多个价格(以及所有其他参数的倍数),如果变量名与SQL列名相同,这会自动将它们存储在基于变量名的列表中吗?不会,这就是为什么您需要另一个表列作为主键,而仅ticker无法满足您的需要,type参数将告诉您的ORM将两个表关联起来
public class StockPrice  {
    @ManyToOne
    @JoinColumn(name = "Ticker")
    private StockPrice stockPrice;

    private List<Double> Price;
    ...
private List<Double> Price;
private Set<Double> Price;
public class Stock extends AbstractEntity  {
@OneToMany(mappedBy="stock", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
/*@JoinColumn(name = "Ticker") <- Don't use this, let hibernate figure this out by the 'mappedBy' */
private List<StockPrice> Price;
(...)
public class StockPrice extends AbstractEntity {
@ManyToOne
@JoinColumn(name = "Ticker")
private StockPrice stockPrice;