Как создать действительные объекты Домена во время выполнения в Grails - PullRequest
0 голосов
/ 24 сентября 2010

У меня есть несколько классов домена, и я хочу иметь возможность заполнить новый класс домена и сохранить его в базе данных через один из моих контроллеров. Вот мои занятия

class Employee implements Comparable
{
    static hasMany = [education:Education]
    static mapping = {
        education cascade:"all,delete-orphan", lazy:false
    }
    List<Education> education = new ArrayList<Education>();
}


public class Education implements Comparable
{
   static belongsTo = [employee:Employee]
   String collegeName
   String areaOfStudy
   String yearGranted
   Date lastModified
   Boolean inProcess = false;
   EducationType type = new EducationType(name:"None");
}


class EducationType
{
    String name="";
}

Теперь я хочу создать новую запись об образовании для конкретного сотрудника с этого контроллера.

        def employee = Employee.get(session.empid);
        EducationType et = new EducationType(name:'JD')
        Education ed1 = new Education(collegeName:'Harvard1', areaOfStudy:'Law', yearGranted:'2015', type:et, lastModified:new Date(), employee:employee)

        employee.addToEducation(ed1)
        employee.save()

По некоторым причинам это не работает должным образом, и я получаю это исключение:

2010-09-24 10:56:01,503 [http-8080-1] ERROR errors.GrailsExceptionResolver  - not-null property references a null or transient value: Education.type; nested exc
eption is org.hibernate.PropertyValueException: not-null property references a null or transient value: Education.type
org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: Education.type; nested exception is org.hiberna
te.PropertyValueException: not-null property references a null or transient value: Education.type
        at org.jsecurity.web.servlet.JSecurityFilter.doFilterInternal(JSecurityFilter.java:382)
        at org.jsecurity.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:180)
        at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: Education.type
        ... 3 more

Я могу избавиться от этого, сначала сохранив EducationType с помощью et.save (), а затем сохранив объект Education с помощью ed.save () и наконец сохранив сотрудника.

Почему это необходимо? Разве мое отображение не говорит о том, что экономия на сотруднике должна распространяться на любые непостоянные объекты, которые теперь связаны с сотрудником?

Кроме того, почему я должен явно добавлять сотрудника при инициализации объекта «Образование»? Он указывается в объекте ownTo, и, похоже, когда я выполняю вызов employee.addToEducation (), он должен быть выбран автоматически, верно?

Спасибо!

1 Ответ

0 голосов
/ 24 сентября 2010

Ваше образование в EducationType определяется как простой один-к-одному. Чтобы перейти от образования к образованию, я думаю, вы можете сделать последнее принадлежащим к первому. Ознакомьтесь с 5.2.1.1 руководства пользователя. Заметьте, вы должны быть осторожны с тем, какую семантику персистентности вы хотите? Вы действительно хотите, чтобы EducationTypes были их собственными сущностями?

Я думаю, что вы должны добавить сотрудника в систему Education, потому что у вас есть двунаправленный сотрудник. Обе стороны отношений должны быть установлены. addToEducation работает для добавления к стороне-владельцу отношения члена коллекции. Очевидно, это не устанавливает отношения между владельцем и владельцем.

---- редактировать ----

Я только что посмотрел на документы, потому что ваша вторая ошибка кажется странной

«Метод addTo * - это динамический метод, который использует ассоциацию для автоматического добавления экземпляров в ассоциацию. Он также автоматически конфигурирует двунаправленное отношение, чтобы обе стороны были установлены.»

Так что похоже, что addTo должен задавать обе стороны отношений ... Если вы убираете сотрудника: сотрудника из вашего образования, оно не работает?

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