我正在學習Hibernate(Spring),並且面臨着從父類刪除子實體的奇怪問題。Hibernate(Spring 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;
}
實體Child:
@Entity
public class CompanyObject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@Enumerated(EnumType.STRING)
ObjectType type;
@ManyToOne
@JoinColumn(name = "company_id")
Company company;
}
這裏是我的表定義:
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
而且,還,我有以下update
方法:
// some code here
public void update(CompanyDto dto) {
Company company = repository.getCompanyById(companyId);
repository.save(dto.merge(company));
}
// some code here
public class CompanyDto {
private List<CompanyObjectDto> companyObjects = new ArrayList<>();
public Company merge(Company company) {
company.getCompanyObjects().clear();
for (CompanyObjectDto dto : companyObjects) {
company.getCompanyObjects().add(dto.to(company));
}
return company;
}
}
public class CompanyObjectDto {
ObjectType type;
public CompanyObject to(Company company) {
CompanyObject object = new CompanyObject();
object.setType(this.getType());
object.setCompany(company);
return object;
}
}
而且我只要一推出update
方法,我得到以下錯誤:java.sql.SQLWarning: Column 'company_id' cannot be null
。我仔細研究了一下,發現如果我註釋掉company.getCompanyObjects().clear();
字符串,它就可以正常工作,所以看起來對公司對象的級聯刪除操作存在一些問題。
請問有人能指出我的錯誤嗎?謝謝。
雙向映射時,應該只有一個@Joincolumn,並且缺少'mappedby'。 – Kirinya
這不是導致問題的原因,但是除非您向'OneToMany'註釋(列表所在的位置)添加',orphanRemoval = true',否則您將發現它不會刪除您從列表中移除的行。沒有它就是什麼會導致你的下一個問題。 – coladict
@Kirinya,謝謝,工作。你能否提出你的答案,以便我可以相應地標記它? –