У меня есть несколько классов домена, и я хочу иметь возможность заполнить новый класс домена и сохранить его в базе данных через один из моих контроллеров. Вот мои занятия
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 (), он должен быть выбран автоматически, верно?
Спасибо!