我遇到了标题保存我的实体中描述的问题,尽管代码和数据库表中的所有内容似乎都没问题 这是我的代码:
@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?如果是,我错过了什么以及错误出现的原因?
答案 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%肯定。试一试。