Почему это приложение Basi c Spring Boot JPA не запустилось - PullRequest
1 голос
/ 14 июля 2020

Я делаю базовый c CURD Spring boot. Я создал приложение Spring Boot из https://start.spring.io/ со ссылками на web, jpa и mysql. Как обычно, я определил репозиторий следующим образом: -

public interface URepository extends JpaRepository<SharedKeyUser, Long> {
}

Я получил эту ошибку: -

org.springframework.beans.factory.BeanCreationException: Ошибка создания bean-компонента с именем 'URepository', определенный в com.example.sharedkeyonetoone.repository.URepository, определенный в @EnableJpaRepositories, объявленном в JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: не удается разрешить ссылку на bean-компонент 'jpaMappingContext' при установке свойства bean-компонента 'mappingContext'; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания bean-компонента с именем 'jpaMappingContext': не удалось вызвать метод инициализации; вложенное исключение: java .lang.IllegalStateException: не удалось асинхронно инициализировать собственный EntityManagerFactory: java .util.NoSuchElementException

Изначально у меня был UserRepository, а позже я переименовал его в URepository. Я все время получаю одну и ту же ошибку. Что не так?

Еще класс, как просили: -

public interface ARepository
    extends JpaRepository<SharedKeyAddress,Long> {

}

    @Entity
@Table(name = "shared_key_address")
public class SharedKeyAddress {
    
    @Id
    @Column(name = "id")
    private Long id;

    @Column(name = "street")
    private String street;

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

    @OneToOne
    @MapsId
    private SharedKeyUser user;

    public Long getId() {
        return id;
    }

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

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public SharedKeyUser getUser() {
        return user;
    }

    public void setUser(SharedKeyUser user) {
        this.user = user;
    }
}


@Entity
@Table(name = "shared_key_users")
public class SharedKeyUser {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "username")
    private String userName;

    @OneToOne(mappedBy = "sharedKeyUser", cascade = CascadeType.ALL)
    private SharedKeyAddress address;

    public Long getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public SharedKeyAddress getAddress() {
        return address;
    }

    public void setAddress(SharedKeyAddress address) {
        this.address = address;
    }
}

Также application.properties :-

spring.datasource.url=jdbc:mysql://localhost:3306/my_dev? 
   useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
spring.datasource.username=dev
spring.datasource.password=dev
# Hibernate
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
log4j.category.org.springframework.web=INFO
logging.level.org.hibernate.SQL=DEBUG

Я пытаюсь установить связь один к одному на основе общего первичного ключа.

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

Многое можно изменить в свой код. Сначала поместите аннотацию @Repository в свои репозитории. Во-вторых, удалите mappedBy = "sharedKeyUser" в SharedKeyUser. и поместите @JoinColumn (name = "address_id", referencedColumnName = "id"). Вместо этого поместите свой mappedBy в свой адресный класс.

@Repository
public interface ARepository
    extends JpaRepository<SharedKeyAddress,Long> {

}

@Entity
@Table(name = "shared_key_address")
public class SharedKeyAddress {

    @Id
    @Column(name = "id")
    private Long id;

    @Column(name = "street")
    private String street;

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

    @OneToOne(mappedBy = "address")
    private SharedKeyUser user;

    public Long getId() {
        return id;
    }

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

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public SharedKeyUser getUser() {
        return user;
    }

    public void setUser(SharedKeyUser user) {
        this.user = user;
    }
}


@Entity
@Table(name = "shared_key_users")
public class SharedKeyUser {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "username")
    private String userName;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id", referencedColumnName = "id")
    private SharedKeyAddress address;

    public Long getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public SharedKeyAddress getAddress() {
        return address;
    }

    public void setAddress(SharedKeyAddress address) {
        this.address = address;
    }
}
0 голосов
/ 14 июля 2020

Имя репозитория не проблема. Убедитесь, что вы добавили к SharedKeyUser Pojo правильные аннотации. @Entity, @ID и @GeneratedValue из javax.persistence API. И убедитесь, что вы также установили свойства источника данных для приложения.

...