grails 3.3: org.hibernate.TransientObjectException с findOrSaveWhere - PullRequest
0 голосов
/ 24 мая 2019

В bootstrap.goovy нам нужно создать статические / тестовые записи базы данных, если они еще не существуют (т.е. созданы, когда приложение было запущено ранее)

 def admin1 =  Operator.findOrSaveWhere(username: "admin", password: "test", firstName: "admin", lastName: "admin", email: "a@b.com")

Создает запись, если она не существует, или читает ее, если она существует. Отлично.

Проблема возникает, когда мы хотим использовать admin1 в качестве поля в другом выражении SQL, например,

  def note1 =  Note.findOrSaveWhere(user: user1, operator: operator1, note: "This is a note. Pretty dull. User is Boib. you can trust him 1")

Это не с:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: come.me.myapp.Operator

findOrSaveWhere, вероятно, только что создал оператор, но не сбрасывается в БД.

обычно, если вы используете admin1.save (flush: true), это решит эту проблему. Есть ли способ очистить что-то, созданное с помощью findOrSaveWhere?

1 Ответ

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

Вы можете использовать findOrCreateWhere:

def admin1 =  Operator.findOrCreateWhere( yadda:yadda, tadda:tadda )
if( !admin1.id ) admin.save flush:true
def note1 =  Note.findOrSaveWhere(user: admin1)

Другой вариант:

Вы должны поместить свой код в загрузочную явную транзакцию в явной транзакции Operator.withTransaction{...}, тогда ваш исходный код должен работать.

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