GenerationType.IDENTITY не генерируется в SpringBoot 2.1.5.RELEASE & MySQL 8.0.15 - PullRequest
0 голосов
/ 16 мая 2019

У меня есть базовое приложение SpringBoot 2.1.5.RELEASE. Использование Spring Initializer, JPA, встроенного Tomcat, механизма шаблонов Thymeleaf и пакета в качестве исполняемого файла JAR.

У меня есть этот класс домена:

     @Entity
        @Table(name="t_purchase")
        @JsonInclude(JsonInclude.Include.NON_NULL)
        public class Purchase implements Serializable {

            public Purchase() {
            }

            public Purchase(Shop shop) {
                super();
                this.shop = shop;
            }

            @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
            @JsonProperty("id")
            private Long id;    

@JsonProperty("txHash")
    private String txHash;

            @ManyToOne(fetch = FetchType.EAGER)
            @JoinColumn(name = “shop_id")
            @JsonIgnore
            Shop shop;


    @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Purchase purchase = (Purchase) o;

            if (getTxHash()==null && purchase.getTxHash()==null) {
                 return id == purchase.id;
            } else {
                return Objects.equals(getTxHash(), purchase.getTxHash());
            }
        }



        @Override
        public int hashCode() {
            int result = (int) (id ^ (id >>> 32));
            result = 31 * result + Objects.hash(getTxHash());
            return result;
        }

        …
        }

тогда я создал этот метод Junit:

   @Test
    public void testFindByShopIdWithPurchases () {

        Shop shop = new Shop ("Shop_NAME");

        shopService.save(shop);

        Purchase purchase1 = new Purchase(shop);
        Purchase purchase2 = new Purchase(shop);

        shop.getPurchases().add(purchase1);
        shop.getPurchases().add(purchase2);

        shopService.save(shop);

        assertNotEquals (purchase1, purchase2);


    }   

Но у меня есть AssertionError, потому что кажется, что для обоих объектов id равен 0:

java.lang.AssertionError: Values should be different. Actual: Purchase [id=0, txHash=null, shop=957]

Здесь магазин:

 @Entity
    @Table(name = “t_shop")
    public class Shop implements Serializable {


        public Shop(String name) {
            this.name = name;
        }

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @JsonProperty("id")
        private Long id;

        @JsonProperty("name")
        private String name;

        @OneToMany(mappedBy = “shop", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
        @JsonIgnore
        private Set<Purchase> purchases = new HashSet<Purchase>();

            …
    }

Ответы [ 3 ]

0 голосов
/ 21 мая 2019
 @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @JsonProperty("id")
        private Long id;   

Поскольку вы используете GenerationType IDENTITY , это означает, что вы несете ответственность за создание идентификатора вместо этого в спящем режиме.

Если вы хотите, чтобы приложение автоматически управляло генерацией идентификатора, используйте GenerationType Авто поэтому обновите ваш GenerationType в Покупка , а также в Магазин Сущность

 @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @JsonProperty("id")
        private Long id;  

............................................... ............................

Если вы все равно получите ошибку после вышеуказанных изменений:

 java.sql.SQLSyntaxErrorException: Table 'shops_db.hibernate_sequence' doesn't exist 

По умолчанию Hibernate генерирует ключ из таблицы hibernate_sequence, мы можем отключить его, установив для этого hibernate.use-new-id-generator-mappings значение false.

spring.jpa.hibernate.use-new-id-generator-mappings=false

установить это свойство в вашем приложении. Свойства

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

попробуйте изменить свойство, указанное ниже
spring.jpa.hibernate.use-new-id-generator-mappings = false
как новая версия весенней загрузки 2.XX изменила это свойство на
spring.jpa.hibernate.use-new-id-generator-mappings = true
используйте ссылку ниже для подробного понимания
Таблица 'DBNAME.hibernate_sequence' не существует

0 голосов
/ 16 мая 2019

Изменение типа на AUTO решило проблему для меня

...