Как исправить JPA данных Spring попробуйте преобразовать строку в десятичную без @Query - PullRequest
0 голосов
/ 16 января 2020

При попытке получить доступ к объекту Masterkey из репозитория dba jpa выдает исключение числового формата. Таблица имеет столбец varchar для поля masterkey и строку для класса сущности. Ниже приведены подробности.

Класс сущности

@Entity
@Table(name = "JP_MasterKey")
public class MasterKey {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "masterId")
  private Long id;
  @Column(name = "keyStr")
  private String keyStr;
  @Column(name = "masterkeyStr")
  @NaturalId
  private String masterKeyString;
  @Column(name = "isbn")
  private String isbn;

  @ManyToOne
  @JoinColumns({@JoinColumn(name = "isbn", insertable = false, updatable = false), @JoinColumn(name = "masterkeyStr", insertable = false, updatable = false)})
  private AdoptionIsbnMap adoptionIsbnMap;

  @ManyToOne
  @JoinColumn(name = "isbn", insertable = false, updatable = false)
  private Title title;

  public Long getId() {
    return id;
  }

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

  public String getKeyStr() {
    return keyStr;
  }

  public void setKeyStr(String keyStr) {
    this.keyStr = keyStr;
  }

  public String getMasterKeyString() {
    return masterKeyString;
  }

  public void setMasterKeyString(String masterKeyStr) {
    this.masterKeyString = masterKeyStr;
  }

  public String getIsbn() {
    return isbn;
  }

  public void setIsbn(String isbn) {
    this.isbn = isbn;
  }

  public AdoptionIsbnMap getAdoptionIsbnMap() {
    return adoptionIsbnMap;
  }

  public void setAdoptionIsbnMap(
      AdoptionIsbnMap adoptionisbnmap) {
    this.adoptionIsbnMap = adoptionisbnmap;
  }

  public Title getTitle() {
    return title;
  }

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

Запрос таблицы

CREATE TABLE `jp_masterkey` (
  `masterId` bigint(20) NOT NULL AUTO_INCREMENT,
  `masterkeyStr` varchar(20) NOT NULL,
  `isbn` varchar(10) DEFAULT NULL,
  `keyStr` varchar(20) NOT NULL,
  PRIMARY KEY (`masterId`),
  UNIQUE KEY `idx_mtkey_keystr` (`masterkeyStr`,`keyStr`),
  KEY `keyStr` (`keyStr`) USING BTREE,
  KEY `idx_jpmasterkeyisbn` (`isbn`),
  KEY `IDX_JP_MASTERKEY_MASTERKEYSTR` (`masterkeyStr`)
) ENGINE=InnoDB AUTO_INCREMENT=21176003 DEFAULT CHARSET=utf8

Класс хранилища

public interface MasterKeyRepository extends CrudRepository<MasterKey,Long> {

  Optional<List<MasterKey>> findByMasterKeyString(String masterKeyString);
}

Вставить этот запрос

INSERT INTO `jacplus`.`jp_masterkey` (`masterkeyStr`, `isbn`, `keyStr`) VALUES ('JP3RKM9LAEVXP', '0730305902', 'F92GULEQZUC');

Выдает исключение при вызове

masterKeyRepository
            .findByMasterKeyString("JP3RKM9LAEVXP")
            .get();
org.springframework.dao.InvalidDataAccessApiUsageException: For input string: "JP3RKM9LAEVXP"; nested exception is java.lang.NumberFormatException: For input string: "JP3RKM9LAEVXP"

Свойства

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

spring.datasource.url =XXXXXXX?serverTimezone=UTC
spring.datasource.username=XXX
spring.datasource.password=XXXX
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

Версии:

Spring Boot

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
MySql Driver

  <modelVersion>4.0.0</modelVersion>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.18</version>

org.springframework.dao.InvalidDataAccessApiUsageException: For input string: "JP3RKM9LAEVXP"; nested exception is java.lang.NumberFormatException: For input string: "JP3RKM9LAEVXP"

at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
        at 

1 Ответ

0 голосов
/ 16 января 2020

С https://thoughts-on-java.org/naturalid-good-way-persist-natural-ids-hibernate/

Естественные идентификаторы являются неизменяемыми по умолчанию, и вы не должны предоставлять для них методы установки. Если вам нужен изменяемый естественный идентификатор, вам нужно установить для атрибута mutable аннотации @NaturalId значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...