org.hibernate.PersistentObjectException:分离的实体传递给persist:com.demo.assistlane.domain.FaqArticle,位于org.hibernate.event.intern 当我点击DeleteAPI时,它给出异常。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
FaqCategory.javaorg.hibernate.PersistentObjectException:分离的实体传递给persist:com.demo.assistlane.domain.FaqArticle,位于org.hibernate.event.intern 当我点击DeleteAPI时,它给出异常。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。,hibernate,spring-data,hibernate-mapping,Hibernate,Spring Data,Hibernate Mapping,FaqCategory.java @Data @Entity @EqualsAndHashCode(callSuper = false) @EntityListeners({ AbstractEntityListener.class }) @Audited public class FaqCategory extends AbstractEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) privat
@Data
@Entity
@EqualsAndHashCode(callSuper = false)
@EntityListeners({ AbstractEntityListener.class })
@Audited
public class FaqCategory extends AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "display_name")
private String displayName;
private String summary;
@OneToMany(mappedBy = "faqCategory", cascade = CascadeType.PERSIST, fetch = FetchType.EAGER, orphanRemoval = true)
private Set<FaqArticle> faqArticle = new HashSet<FaqArticle>();
}
DtoDomainConversationService.java
@Service
public class FaqArticleService extends AbstractService<FaqArticle, Long> {
@Autowired
private FaqArticleRepository faqArticleRepository;
@Autowired
private DTOToDomainConverstionService dtoToDomainConverstionService;
public FaqArticleService(FaqArticleRepository faqArticleRepository) {
super(faqArticleRepository);
this.faqArticleRepository = faqArticleRepository;
}
public FaqArticle getById(Long id) {
return faqArticleRepository.findOne(id);
}
@Transactional
public FaqArticle createFaqArticle(FaqArticleDTO faqArticleDTO) {
FaqArticle faqArticle = dtoToDomainConverstionService.convertFaqArticle(faqArticleDTO);
return faqArticleRepository.save(faqArticle);
}
public Page<FaqArticle> getAllFaqArticle(Pageable pageable) {
return faqArticleRepository.findAll(pageable);
}
public List<FaqArticle> getAllFaqArticle() {
return faqArticleRepository.findAll();
}
@Transactional
public void deleteFaqArticle(Long id) {
FaqArticle faqArticle = getById(id);
faqArticleRepository.delete(faqArticle);
}
@Transactional
public void deleteAllFaqArticle() {
faqArticleRepository.deleteAll();
}
}
@Service
public class DTOToDomainConverstionService {
public FaqCategory convertFAQCategory(FaqCategoryDTO faqCategoryDTO) {
FaqCategory faqCategory = new FaqCategory();
Set<FaqArticleDTO> faqArticleDTOs = faqCategoryDTO.getFaqArticleDTO();
Set<FaqArticle> faqArticles = new HashSet<FaqArticle>();
for (FaqArticleDTO faqArticleDTO : faqArticleDTOs) {
FaqArticle faqArticle = new FaqArticle();
faqArticle.setBody(faqArticleDTO.getBody());
faqArticle.setPublish(faqArticleDTO.getPublish());
faqArticle.setKeywords(faqArticleDTO.getKeywords());
faqArticle.setFaqCategory(faqCategory);
Set<FaqArticle> subfaqArticles = new HashSet<FaqArticle>();
for (FaqArticleDTO subfaqArticleDTO : faqArticleDTO.getFaqRelatedArticles()) {
FaqArticle subfaqArticle = new FaqArticle();
subfaqArticle.setBody(subfaqArticleDTO.getBody());
subfaqArticle.setPublish(subfaqArticleDTO.getPublish());
subfaqArticle.setKeywords(subfaqArticleDTO.getKeywords());
subfaqArticle.setFaqCategory(faqCategory);
subfaqArticles.add(subfaqArticle);
}
faqArticle.setFaqRelatedArticles(subfaqArticles);
faqArticles.add(faqArticle);
}
faqCategory.setDisplayName(faqCategoryDTO.getDisplayName());
faqCategory.setSummary(faqCategoryDTO.getSummary());
faqCategory.setFaqArticle(faqArticles);
return faqCategory;
}
public FaqArticle convertFaqArticle(FaqArticleDTO faqArticleDTO) {
FaqArticle faqArticle = new FaqArticle();
faqArticle.setBody(faqArticleDTO.getBody());
faqArticle.setPublish(faqArticleDTO.getPublish());
faqArticle.setKeywords(faqArticleDTO.getKeywords());
/*Set<FaqArticle> subfaqArticles = new HashSet<FaqArticle>();
for (FaqArticleDTO subfaqArticleDTO : faqArticleDTO.getFaqRelatedArticles()) {
FaqArticle subfaqArticle = new FaqArticle();
subfaqArticle.setBody(subfaqArticleDTO.getBody());
subfaqArticle.setPublish(subfaqArticleDTO.getPublish());
subfaqArticle.setKeywords(subfaqArticleDTO.getKeywords());
subfaqArticles.add(subfaqArticle);
}
faqArticle.setFaqRelatedArticles(subfaqArticles);*/
return faqArticle;
}
}
@服务
公共类DTotomainConversationService{
公共FaqCategory convertFAQCategory(FAQCategoryTo FAQCategoryTo){
FaqCategory FaqCategory=新建FaqCategory();
设置faqArticleDTOs=FaqCategoryTo.getFaqArticleDTO();
Set faqArticles=newhashset();
适用于(常见问题解答文章至常见问题解答文章至:常见问题解答文章至){
FaqArticle FaqArticle=新建FaqArticle();
setBody(faqArticleDTO.getBody());
setPublish(faqArticleDTO.getPublish());
faqArticle.setKeywords(faqArticleDTO.getKeywords());
faqArticle.setFaqCategory(faqCategory);
Set subfaqArticles=newhashset();
for(FaqArticleDTO子AQArticledTo:FaqArticleDTO.getFaqRelatedArticles()){
FaqArticle subfaqArticle=新建FaqArticle();
subAQarticle.setBody(subAQarticledTo.getBody());
subAQarticle.setPublish(subAQarticledto.getPublish());
subAQarticle.setKeywords(subAQarticledto.getKeywords());
子类文章。设置faqCategory(faqCategory);
子条款。添加(子条款);
}
faqArticle.setFaqRelatedArticles(子类文章);
添加(faqArticle);
}
faqCategory.setDisplayName(FaqCategoryTo.getDisplayName());
faqCategory.setSummary(faqCategoryDTO.getSummary());
faqCategory.setFaqArticle(faqArticles);
返回常见问题解答类别;
}
公共常见问题解答文章转换常见问题解答文章(常见问题解答文章到常见问题解答文章){
FaqArticle FaqArticle=新建FaqArticle();
setBody(faqArticleDTO.getBody());
setPublish(faqArticleDTO.getPublish());
faqArticle.setKeywords(faqArticleDTO.getKeywords());
/*Set subfaqArticles=newhashset();
for(FaqArticleDTO子AQArticledTo:FaqArticleDTO.getFaqRelatedArticles()){
FaqArticle subfaqArticle=新建FaqArticle();
subAQarticle.setBody(subAQarticledTo.getBody());
subAQarticle.setPublish(subAQarticledto.getPublish());
subAQarticle.setKeywords(subAQarticledto.getKeywords());
子条款。添加(子条款);
}
faqArticle.setFaqRelatedArticles(子类文章)*/
返回常见问题解答文章;
}
}
您应该将FaqArticle
上的faqCategory
属性显式设置为空
如果您确实希望将该值设置为非空值,您应该确保在活动会话的边界内获取适当的
FaqArticle
,以便在保存新的FaqArticle
时不会分离实例,以避免此失败。请添加此方法dtotomainconversationservice.convertFaqArticle。
@RestController
@RequestMapping(value = "/faqArticles")
public class FaqArticleController {
@Autowired
private FaqArticleService faqArticleService;
@Autowired
private FaqArticleResourceAssembler faqArticleResourseAssembler;
@Autowired
private PagedResourcesAssembler<FaqArticle> pagedResourcesAssembler;
@SuppressWarnings({ "rawtypes", "unchecked" })
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<PagedResources> getAllFaqArticle(Pageable pageable) {
Page<FaqArticle> faqArticlePage = faqArticleService.getAllFaqArticle(pageable);
PagedResources pagedResources = pagedResourcesAssembler.toResource(faqArticlePage, faqArticleResourseAssembler);
if (faqArticlePage.getContent() == null || faqArticlePage.getContent().isEmpty()) {
EmbeddedWrappers wrappers = new EmbeddedWrappers(false);
EmbeddedWrapper wrapper = wrappers.emptyCollectionOf(FaqCategory.class);
List<EmbeddedWrapper> embedded = Collections.singletonList(wrapper);
pagedResources = new PagedResources(embedded, pagedResources.getMetadata(),
pagedResources.getLinks());
}
return new ResponseEntity<PagedResources>(pagedResources, HttpStatus.OK);
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<FaqArticleResource> getFaqArticle(@PathVariable Long id){
FaqArticle faqArticle = faqArticleService.getById(id);
FaqArticleResource rsource = faqArticleResourseAssembler.toResource(faqArticle);
return new ResponseEntity<FaqArticleResource>(rsource, HttpStatus.OK);
}
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<FaqArticleResource> saveFaqArticle(@RequestBody FaqArticleDTO faqArticleDTO){
FaqArticle faqArticle = faqArticleService.createFaqArticle(faqArticleDTO);
FaqArticleResource rsource = faqArticleResourseAssembler.toResource(faqArticle);
return new ResponseEntity<FaqArticleResource>(rsource, HttpStatus.CREATED);
}
@RequestMapping(method = RequestMethod.DELETE)
public ResponseEntity<Void> deleteAllFaqArticle(){
faqArticleService.deleteAllFaqArticle();
return ResponseEntity.noContent().build();
}
@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
public ResponseEntity<Void> deleteFaqArticle(@PathVariable Long id){
faqArticleService.deleteFaqArticle(id);
return ResponseEntity.noContent().build();
}
}
# server config block
server.port = 9999
# Connection url for the database "netgloo_blog"
spring.datasource.url = jdbc:mysql://localhost:3306/assistlane?createDatabaseIfNotExist=true&verifyServerCertificate=false&useSSL=false&requireSSL=false
spring.datasource.dataSourceClassName=com.mysql.jdbc.Driver
#spring.data.rest.basePath=/api
# Username and password
spring.datasource.username = root
spring.datasource.password = root
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.org.hibernate.envers.audit_table_suffix=_audit
spring.jpa.properties.org.hibernate.envers.store_data_at_delete= true
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
@Service
public class DTOToDomainConverstionService {
public FaqCategory convertFAQCategory(FaqCategoryDTO faqCategoryDTO) {
FaqCategory faqCategory = new FaqCategory();
Set<FaqArticleDTO> faqArticleDTOs = faqCategoryDTO.getFaqArticleDTO();
Set<FaqArticle> faqArticles = new HashSet<FaqArticle>();
for (FaqArticleDTO faqArticleDTO : faqArticleDTOs) {
FaqArticle faqArticle = new FaqArticle();
faqArticle.setBody(faqArticleDTO.getBody());
faqArticle.setPublish(faqArticleDTO.getPublish());
faqArticle.setKeywords(faqArticleDTO.getKeywords());
faqArticle.setFaqCategory(faqCategory);
Set<FaqArticle> subfaqArticles = new HashSet<FaqArticle>();
for (FaqArticleDTO subfaqArticleDTO : faqArticleDTO.getFaqRelatedArticles()) {
FaqArticle subfaqArticle = new FaqArticle();
subfaqArticle.setBody(subfaqArticleDTO.getBody());
subfaqArticle.setPublish(subfaqArticleDTO.getPublish());
subfaqArticle.setKeywords(subfaqArticleDTO.getKeywords());
subfaqArticle.setFaqCategory(faqCategory);
subfaqArticles.add(subfaqArticle);
}
faqArticle.setFaqRelatedArticles(subfaqArticles);
faqArticles.add(faqArticle);
}
faqCategory.setDisplayName(faqCategoryDTO.getDisplayName());
faqCategory.setSummary(faqCategoryDTO.getSummary());
faqCategory.setFaqArticle(faqArticles);
return faqCategory;
}
public FaqArticle convertFaqArticle(FaqArticleDTO faqArticleDTO) {
FaqArticle faqArticle = new FaqArticle();
faqArticle.setBody(faqArticleDTO.getBody());
faqArticle.setPublish(faqArticleDTO.getPublish());
faqArticle.setKeywords(faqArticleDTO.getKeywords());
/*Set<FaqArticle> subfaqArticles = new HashSet<FaqArticle>();
for (FaqArticleDTO subfaqArticleDTO : faqArticleDTO.getFaqRelatedArticles()) {
FaqArticle subfaqArticle = new FaqArticle();
subfaqArticle.setBody(subfaqArticleDTO.getBody());
subfaqArticle.setPublish(subfaqArticleDTO.getPublish());
subfaqArticle.setKeywords(subfaqArticleDTO.getKeywords());
subfaqArticles.add(subfaqArticle);
}
faqArticle.setFaqRelatedArticles(subfaqArticles);*/
return faqArticle;
}
}