Hibernate / JPA,field' accreditation_company_id'没有默认值错误

时间:2016-09-30 12:59:34

标签: spring hibernate jpa

我遇到了标题保存我的实体中描述的问题,尽管代码和数据库表中的所有内容似乎都没问题 这是我的代码:

@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  

对象I尝试保存包含以下信息:

公司(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);
    }

我是否认为hibernate会自动生成并填充这些对象中缺少的所有ID?如果是,我错过了什么以及错误出现的原因?

1 个答案:

答案 0 :(得分: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;
}

注意CompanyObject中的@ManyToOne注释。如果我理解正确,您希望将一个或多个CompanyObject分配给公司,那么您必须在@ManyToOne中添加Company带注释的CompanyObject字段。

现在,如果要保存这些对象,首先保存Company实例,然后遍历CompanyObject列表,设置先前保存的公司实例,然后保存{{1 s,像这样:

CompanyObject

您的updateCompany方法错误,您应该尝试类似上面的代码。 (我不能重写你的例子,因为它看起来像是缺少什么。什么是CompanyDTO?)

修改:您可以使用级联保存(注意:我已更新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); } 实体),只需确保将Company实例设置为每{ {1}}实例,如:

Company

我认为这应该有效,但我不是100%肯定。试一试。