2016-09-30 3 views
0

Я столкнулся с проблемой, описанной в заголовке, сохраняющим мою сущность, хотя все в таблицах кода и db выглядит нормально.
Вот мой код:Hibernate/JPA, поле 'accreditation_company_id' не имеет значения по умолчанию

@Entity 
public class Company { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumn(name = "company_id", referencedColumnName = "id") 
    List<CompanyObject> companyObjects; 
} 


@Entity 
public class CompanyObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @Enumerated(EnumType.STRING) 
    ObjectType type; 
} 

Вот мои определения таблицы:

CREATE TABLE `company` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 

CREATE TABLE `company_object` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `company_id` bigint(20) NOT NULL, 
    `type` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK__company` (`company_id`), 
    CONSTRAINT `FK__company` FOREIGN KEY (`company_id`) REFERENCES `company` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Объект Я пытаюсь сохранить содержит следующую информацию:

Company (ID = 32, companyObjects = [CompanyObject (id = null, type = NEW)])

Вот код, который я использую для сохранения объекта:

Метод

Контроллер:

@RequestMapping(value = "/company/{id}", method = RequestMethod.POST) 
public String editCompany(@PathVariable("id") long companyId, 
          @ModelAttribute("form") CompanyDto form) { 
    Company company = companyService.getCompanyById(companyId); 
    companyService.updateCompany(company, form); 
    return "redirect:/companies"; 
} 

метод обслуживания:

@Transactional 
    public Company updateCompany(Company company, final CompanyDto form) { 
     company.getCompanyObjects().clear(); 
     company.getCompanyObjects().addAll(form.getCompanyObjects()); 
     return companyRepository.save(company); 
    } 

Я получаю это право, что спящий режим автоматически генерировать и заполнить все недостающие идентификаторы в этих объектах? Если да, то чего мне не хватает и почему появляется ошибка?

+0

Как вы сохраняете эти объекты? Покажите нам какой-то код. – nagyf

+0

@nagyf, я обновляю ответ с помощью некоторого кода. Спасибо за комментарий! –

ответ

1

У вас есть некоторые проблемы здесь. Во-первых, ваши определения таблиц неверны, проверьте таблицу accreditation_object, у вас есть внешний ключ, который ссылается на столбец, который не существует: company_id должен быть accreditation_company_id. (или это только некоторые копипаст ошибка?)

Во-вторых, ваши лица являются неправильными, попробуйте так:

@Entity 
public class Company { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @OneToMany(mappedBy="company", cascade = CascadeType.ALL) 
    Set<CompanyObject> companyObjects; 
} 


@Entity 
public class CompanyObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @Enumerated(EnumType.STRING) 
    ObjectType type; 

    @ManyToOne 
    @JoinColumn(name = "company_id") 
    Company company; 
} 

Обратите внимание на @ManyToOne аннотаций в CompanyObject. Если я правильно понимаю, вы хотите присвоить Компании один или несколько CompanyObject, таким образом, вы должны ввести @ManyToOne аннотированное поле ввода Company в CompanyObject.

Теперь, если вы хотите сохранить эти объекты, первый сохранить экземпляр Company, затем перебирать список CompanyObject с, установить ранее сохраненный экземпляр компании, а затем сохранить CompanyObject s, что-то вроде этого:

Company company = new Company(); 
companyDao.persist(company); 

List<CompanyObject> companyObjects = new ArrayList<>(); 
// populate the list somehow 
// ... 

for(CompanyObject obj: companyObjects){ 
    obj.setCompany(company); 
    companyObjectDao.persist(obj); 
} 

Ваш метод updateCompany неверен, вы должны попробовать что-то вроде вышеуказанного кода. (Я не могу переписать пример, потому что это выглядит как-то не хватает там Что такое CompanyDTO.?)

Edit: Вы можете использовать сохранение каскадного (примечание: Я обновил Company сущности), просто убедитесь, что установлено Company экземпляр для каждого CompanyObject, например, как:

@Transactional 
public Company updateCompany(Company company, final CompanyDto form) { 
    company.getCompanyObjects().clear(); 
    company.getCompanyObjects().addAll(form.getCompanyObjects()); 
    for(CompanyObject obj : company.getCompanyObjects()){ 
     obj.setCompany(company); 
    } 
    return companyRepository.save(company); 
} 

Я думаю, что это должно работать, но я не уверен на 100%. Попробуйте.

+0

Спасибо миллион @nagyf, я попробую. Что касается беспорядка с именованием - вы правы, это просто ошибка копирования-пасты.Просто интересно, можно ли оставить структуру объекта, которую у меня есть, и выполнить как-то сэкономить? Не является ли свойство 'cascade' для детского сохранения, не так ли? –

+0

Я обновил ответ – nagyf

+0

Спасибо, @nagyf, это сработало, вы спасатель жизни! –

Смежные вопросы