Grails 4.0 не может сохранить домен в БД - PullRequest
0 голосов
/ 03 октября 2019

Я не очень знаком с Граалем, но этот случай для меня странен. Я создал доменное имя Product и хотел сохранить некоторые базовые данные в Bootstrap.groovy, но product.save () не сохранен в моей БД. Когда я пытаюсь получить весь продукт с помощью Product.getAll (), я получаю пустой массив. Но когда я создаю все леса для этого объекта домена, Grails использует ProductService для выполнения операции сохранения, и они видны в БД. Я делаю что-то не так или Save with Product.save () не поддерживается?

class Product {
    UUID id
    String name

    static constraints = {
    }

    static mapping = {
        id generator : 'uuid2', type: 'pg-uuid' // pg-uuid because I use postgresql
    }
}
class BootStrap {

    def init = { servletContext ->

        def product = new Product(name: 'Launch day 1')
        product.save()

        def product1 = new Product(name: 'Launch day 2')
        product1.save()
        def product2 = new Product(name: 'Launch day 3')
        product2.save()
    }
    def destroy = {
    }
}


@Service(Product)
interface ProductService {

    Product get(Serializable id)

    List<Product> list(Map args)

    Long count()

    void delete(Serializable id)

    Product save(Product product)

}
dataSource:
  pooled: true
  driverClassName: org.postgresql.Driver
  dialect: org.hibernate.dialect.PostgreSQLDialect
  username: "postgres"
  password: "postgres"
  dbCreate: create-drop
  url: jdbc:postgresql://localhost:6543/grails_t
  properties:
    jmxEnabled: true
    initialSize: 5
    maxActive: 50
    minIdle: 5
    maxIdle: 25
    maxWait: 10000
    maxAge: 10 * 60000
    timeBetweenEvictionRunsMillis: 5000
    minEvictableIdleTimeMillis: 60000
    validationQuery: "SELECT 1"
    validationQueryTimeout: 3
    validationInterval: 15000
    testOnBorrow: true
    testWhileIdle: true
    testOnReturn: false
    jdbcInterceptors: "ConnectionState;StatementCache(max=200)"
    defaultTransactionIsolation: java.sql.Connection.TRANSACTION_READ_COMMITTED

1 Ответ

3 голосов
/ 03 октября 2019

Hibernate 5.2+ требует транзакций для операций записи и чтения.

Оберните свои сбережения в транзакцию, используя созданный вами ProductService - например, productService.save(product1)

Другие способы убедиться, что это в транзакции, - использовать @Transactional в методе илиProduct.withTransaction { }

...