2016-09-30 1 views
0

코드 및 db 테이블의 모든 내용이 정상인 것처럼 보이지만 본인의 항목을 저장하는 제목에서 설명한 문제에 직면했습니다. 내가 저장하기 위해 노력하고있어Hibernate/JPA, 필드 'accreditation_company_id'에 기본값이 없습니다. 오류

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 

객체는 다음과 같은 정보를 포함합니다 :

회사 (ID가 = 32, companyObjects 여기

@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; 
} 

내 테이블 정의입니다 :
여기 내 코드입니다 = [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); 
    } 

내가 생성하고 이러한 개체의 모든 누락 된 ID를 채우는 자동으로 최대 절전이 권리는 무엇입니까? 예인 경우 무엇이 누락되며 오류가 나타나는 이유는 무엇입니까?

+0

어떻게 이러한 개체를 저장 하시겠습니까? 몇 가지 코드를 보여주십시오. – nagyf

+0

@ nagyf, 일부 코드로 답변을 업데이트합니다. 코멘트 주셔서 감사합니다! –

답변

1

여기에 몇 가지 문제가 있습니다. 첫째, 테이블 정의가 잘못되었으므로 accreditation_object 테이블을 확인하십시오. 존재하지 않는 열을 참조하는 외래 키가 있습니다. company_idaccreditation_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; 
} 

참고 CompanyObject에서 @ManyToOne 주석을. 올바르게 이해하면 하나 이상의 CompanyObject를 회사에 할당하려고하므로 에 주석이 달린 Company 입력란이 있어야합니다.

을 : 당신이 다음, 먼저 Company 인스턴스를 저장, 이러한 개체를 저장 CompanyObject의 목록을 반복 할 경우

지금,이처럼 CompanyObject에 뭔가를 저장 한 후 이전에 저장 한 회사의 인스턴스를 설정하고,

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 무엇입니까 귀하의 예를 다시 작성할 수없는 이유는 무엇입니까?)

편집 : 당신은 캐스케이드 절약 사용할 수 있습니다 (참고 : 나는 Company 엔티티를 업데이트 한), 단지 설정해야합니다 같은 모든 CompanyObject 인스턴스에 Company 예 :

@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, 효과가있어, 당신은 생명의 은인입니다! –

관련 문제