Таблица связей один-ко-многим в Hibernate - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь изучить Hibernate и, начиная со следующей проблемы, я моделирую приложение со спортивным результатом. У меня есть следующие таблицы оракулов.

У меня есть таблица LEAGUES с первичным ключом LEAGUE_ID и таблица TEAMS с первичным ключом TEAM_ID и внешним ключом LEAGUE_ID. В одной лиге будет много команд.

Таблица LEAGUES описывается как ....

Name            Null     Type         
--------------- -------- ------------ 
LEAGUE_ID       NOT NULL NUMBER(38)   
LEAGUE_NAME     NOT NULL VARCHAR2(30) 
NUMBER_OF_TEAMS          NUMBER(38)   
GOALS                    VARCHAR2(1)  
CORNERS                  VARCHAR2(1)  
START_DATE               DATE         

И КОМАНДЫ как ....

Name               Null     Type          
--------------- -------- ------------ 
TEAM_ID            NOT NULL NUMBER(38)   
LEAGUE_ID          NOT NULL NUMBER(38)   
TEAM_NAME          NOT NULL VARCHAR2(40) 
PREVIOUS_LEAGUE_ID NOT NULL NUMBER(38)   
STADIUM_NAME                VARCHAR2(40) 
CURRENT_GRADE               VARCHAR2(1)  
CITY                        VARCHAR2(30) 

Я пытаюсь следовать этому уроку: https://www.baeldung.com/hibernate-one-to-many

Мои классы сущностей выглядят следующим образом, @Data - это аннотация lombok, поэтому автоматически генерируются методы получения / установки, конструкторы ...

@Data
@Entity
@Table(name="Leagues")
public class League {

    @Id
    @Column(name="league_id", updatable=false, nullable=false)
    private int leagueId;

    @Column(name="league_name")
    private String leagueName;

    @Column(name="number_of_teams")
    private int numberOfTeams;

    private String goals;

    private String corners;

    @Column(name="start_date")
    private Date startDate;

    @OneToOne(mappedBy = "league")
    private Set<Team> teams;
}
@Data
@Entity
@Table(name="Teams")
public class Team {

    @Id
    @Column(name="team_id", updatable=false, nullable=false)
    private int teamId;

    @ManyToOne
    @JoinColumn(name="league_id")
    private League league;

    @Column(name="team_name")
    private String teamName;

    @Column(name="previous_league_id")
    private int previousLeagueId;

    @Column(name="stadium_name")
    private String stadiumName;

    @Column(name="current_grade")
    private String currentGrade;

    @Column(name="city")
    private String city;
}

Я просто сейчас пытаюсь получить данные, используя это ...

public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Transactional(readOnly = true)
    @Override
    public void run(String... args) throws Exception {

        System.out.println("DATASOURCE = " + dataSource);

        System.out.println("\n1.findAll()...");
        for (Team team : teamRepository.findAll()) {
            System.out.println(team);
        }

        for (League league : leagueRepository.findAll()) {
            System.out.println(league);
        }
    ...
    }

Но я получаю следующее исключение;

2019-06-06 16:02:22 ERROR 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 org.hibernate.AnnotationException: Unknown mappedBy in: hello.model.League.teams, referenced property unknown: java.util.Set.league
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
    at hello.Application.main(Application.java:47)
Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: hello.model.League.teams, referenced property unknown: java.util.Set.league
    at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:147)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1655)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1623)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
    ... 15 common frames omitted

Process finished with exit code 1

Я уже работал до того, как попытался представить отображение, поэтому основной класс и lombok должны быть в порядке. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 06 июня 2019

Здесь

 @OneToOne(mappedBy = "league")
 private Set<Team> teams;

Я думаю, вы имели в виду

 @OneToMany(mappedBy = "league")
 private Set<Team> teams;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...