当前位置: 首页 > 知识库问答 >
问题:

多对多组织。冬眠PersistentObjectException:传递给persist的分离实体

葛念
2023-03-14

我编写了第一个java应用程序来读取rss流,并使用springspring数据hibernate。我的模特<代码>RssFeed:

@Entity(name = "RssFeed")
@Table(name = "FEED")
@JsonIgnoreProperties({"rssChannel"})
public class RssFeed {

  @Id
  @GeneratedValue
  @Column
  private Integer id;

  @Column(unique = true)
  @Index(name = "title_index")
  private String title;

  @Column
  @URL
  private String link;

  @Column
  private String description;

  @Column
  private String content;

  @Column
  @Temporal(TemporalType.TIMESTAMP)
  private Date pubDate;

  @Column
  @Temporal(TemporalType.TIMESTAMP)
  private Date updateDate;


  @ManyToOne
  @JoinColumn(name = "channelId")
  private RssChannel rssChannel;

  @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinTable(name = "feed_category",
          joinColumns = {@JoinColumn(name = "feed_id", nullable = false, updatable = false)},
          inverseJoinColumns  = {@JoinColumn(name = "category_id", nullable = false, updatable = false)})
  private Set<RssCategory> rssCategories = new LinkedHashSet<RssCategory>();
}

RssChannel

@Entity(name = "RssChannel")
@Table(name = "Channel",
        uniqueConstraints = @UniqueConstraint(columnNames = {"link"}))
@JsonIgnoreProperties({"feeds"})
public class RssChannel implements Serializable{

  @Id
  @GeneratedValue
  @Column
  private Integer id;

  @Column
  private String title;

  @Column(unique = true)
  @org.hibernate.validator.constraints.URL
  private String link;

  @Column
  @org.hibernate.validator.constraints.URL
  private String image;

  @Column
  private String description;

  @OneToMany(mappedBy = "rssChannel", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<RssFeed> feeds = new LinkedList<RssFeed>();
}

RssCategory

@Entity(name = "RssCategory")
@Table(name = "CATEGORY")
@JsonIgnoreProperties({"rssFeeds"})
public class RssCategory {

    @Id
    @GeneratedValue
    @Column
    private Integer id;

    @Column(unique = true)
    private String title;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "rssCategories")
    public Set<RssFeed> rssFeeds = new LinkedHashSet<RssFeed>();
}

我使用crudepository处理数据。如果不使用多对多功能保存RssFeed,则可以:

RssChannel channel = rssChannelService.get(url.toString());
rssFeed.setRssChannel(channel);
rssFeedService.save(rssFeed);

但当我加上一句话:

rssCategory rssCategory = rssCategoryService.findOrCreate("test");
rssFeed.getRssCategories().add(rssCategory);
rssFeedService.save(rssFeed);

获取异常rg。冬眠PersistentObjectException:传递给persist:RssCategory的分离实体

我的RssFeedServiceImpl:

@Service
public class RssFeedServiceImpl implements RssFeedService {

  @Autowired
  private RssChannelDAO rssChannelDAO;

  @Autowired
  private RssFeedDAO rssFeedDAO;

  @Override
  public Page<RssFeed> findAll(Pageable pageable) {
    return rssFeedDAO.findAll(pageable);
  }

  @Override
  public Page<RssFeed> findAll(int rssChannelId, Pageable pageable) {
    RssChannel rssChannel = rssChannelDAO.findOne(rssChannelId);
    return rssFeedDAO.findByRssChannel(rssChannel, pageable);
  }

  @Override
  public RssFeed get(String title) {
    return rssFeedDAO.findByTitle(title);
  }

  @Override
  public RssFeed save(RssFeed rssFeed) {
    return rssFeedDAO.save(rssFeed);
  }

}

和RssCategoryServiceImpl:

@Service
public class RssCategoryServiceImpl implements RssCategoryService {

    @Autowired
    RssCategoryDAO rssCategoryDAO;

    @Override
    public RssCategory findOrCreate(String title) {
        RssCategory category = rssCategoryDAO.findByTitle(title);
        if (category == null) {
            category = new RssCategory();
            category.setTitle(title);
            category = rssCategoryDAO.save(category);
        }
        return category;
    }
}

拯救多少对多少?

共有1个答案

岳正浩
2023-03-14

您可能需要先保存您的Rss分类,以便将ID存储在feed_category表中。最后一次保存将在您进行分配时自动进行:

rssFeed.getRssCategories().add(rssCategory); 

但首先你需要做:

rssFeedService.save(rssCategory);

您可能需要将此操作放在事务中。

 类似资料:
  • 初始数据。专业有很多科目。 专业JAVA 对于一个主题来说,专业不能为空。我希望它能以下一种方式工作:当我保存/更新/分离一个主题时,同样的操作必须应用于专业。当我删除一个主题时,专业不会发生任何变化。 主题JAVA 我写了一个集成测试。生成专业()和生成主题()这只是util方法。 你可以在这张图片上看到测试结果。 subjectService在此处引发了异常。保存(主题1); 原因:org。冬

  • 我使用的是Spring Boot 4、Hibernate和JPA注释。我遇到了这个错误 组织。冬眠PersistentObjectException:传递给persist的分离实体。 我试着在互联网上搜索,但没有找到正确的答案。我尝试使用而不是,但没有成功。此外,我认为在更新资源时使用。 这是我的代码: ` `积垢服务 ` ` 存储库 ` '抽象存储库 ` ` 工厂` '支持形式 ` ` 控制器

  • 在我的spring应用程序中,我尝试在数据库中持久化以下实体: 我面临着这个错误: atribute密钥位于Atributo类: 保存操作的处理方式如下: 有人能指出一个正确的方向来维持这个实体吗? 注:项目的完整代码可以在这里找到: https://github.com/klebermo/webapp_horario_livre

  • JPA和Hibernate的新手,所以请耐心等待,因为我试图绘制一整张图片。所以我有两个具有双向关系的Java对象。员工类是拥有类,部门类是关系的反面。一个部门可以有许多员工,一个员工只能有一个部门。我分配了employee_id作为员工实体的主键,department_id作为部门实体的主键。我还想在员工类中使用department_id作为外键。 员工类 部门类 我用来生成两个对象并将它们保存

  • 我是Hibernate的新手,我需要帮助。 我有一个名为Kasa的表,它有3个属性-id、address和account\u id。在我的表中有12行。我想使用Hibernate对此进行映射,并使用Java添加新的映射,所以我这样做了: 我也有能手和二传手,但不需要复制。 现在我想在我的数据库中添加新行,如下所示: 我得到这样的错误:javax.persistence.PeristenceExce