2014-12-04 4 views
1

У меня есть модель, как это:Hibernate вопрос о создании OnetoMany, ManyToOne Mapping Предоставление нулевой

@Entity 
[...] 
class ParentObject{ 
    [...] 
    @OneToMany(cascade = CascadeType.ALL, mappedBy= "parentObject", orphanRemoval = true) 
    private List<Relationship> relationship; 
} 

и в отношениях субъекта:

@ManyToOne 
@JoinColumn(name="PARENT_OBJECT_ID") 
private ParentObject parentObject; 

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

parentObject: { 
    id: null, 
    relationship: [ 
     {id:null, 
     parentObjectId:null, 
     [...] 
    }] 
} 

спящий режим не имеет идентификатор для ParentObject, так Relationship.parentObject.id равна нулю. База данных выдает ошибку, говоря:

не может вставить NULL в ("MyDB" "отношения" "parent_object_id"..)

Любая помощь будет оценена.

Edit: Вот мой код услуги:

public ParentObjectDto save(ParentObjectDto parentObjectDto) { 
ParentObject parentObject = dtoConverter.convert(parentObjectDto, ParentObject.class);  

boolean isNewPO = parentObject.getId() == null ? true : false; 

parentObject = parentObjectRepository.save(parentObject); 

if (isNewPO) { 
    // This loop ensures that when a new PO is added, the child relationship 
    // objects are connected with the new parentObject that was just added. 
    for (Relationship relationship : parentObject.getRelationship()) { 
     relationship.setParentObject(parentObject); 
    } 
} 

return dtoConverter.convert(parentObject, ParentObjectDto.class); 

}

имена, конечно, не те, которые я пишу здесь, я просто изменил их, чтобы быть более понятным, если у меня есть какие-либо орфографические ошибки происходят из моих изменений вручную :)

+0

Можете ли вы опубликовать свой код обслуживания, который создает и сохраняет объекты? –

+0

Да, я просто добавил код моей службы. –

ответ

1

Глядя на код, проблема может быть в том случае, когда isNewPO истинно, вы сначала сохраняете PO, после чего вы устанавливаете этот родительский объект в отношении. Это означает, что во время сохранения PO отношения не имеют своего набора PO, что приводит к тому, что NULL вставляется в столбец PARENT_OBJECT_ID (отношения также сохраняются в это время из-за cascade = CascadeType.ALL).

Для решения этой проблемы либо переместите parentObject = parentObjectRepository.save(parentObject); после цикла, либо подключите PO и его отношения в dtoConverter.convert().

+0

Вы так верно не можете поверить, что я не думал об этом, 3 часа отладки были потрачены впустую из-за этого! Благодаря! –

+0

:) Добро пожаловать. –