![](/img/trans.png)
[英]Hibernate. Many to many giving an “org.hibernate.PersistentObjectException detached entity passed to persist” error
[英]Many to many org.hibernate.PersistentObjectException: detached entity passed to persist
我編寫了第一個Java應用程序以讀取rss流,並使用spring
, spring-data
和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>();
}
我使用CrudRepository
來處理數據。 當保存RssFeed時沒有很多限制時:
RssChannel channel = rssChannelService.get(url.toString());
rssFeed.setRssChannel(channel);
rssFeedService.save(rssFeed);
但是當我添加RssCategory時:
rssCategory rssCategory = rssCategoryService.findOrCreate("test");
rssFeed.getRssCategories().add(rssCategory);
rssFeedService.save(rssFeed);
獲取異常: rg.hibernate.PersistentObjectException: detached entity passed to 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;
}
}
如何保存多對多?
您可能需要先保存RssCategory,以便將ID存儲在feed_category表中。 完成分配后,最后一次保存將自動進行:
rssFeed.getRssCategories().add(rssCategory);
但首先,您需要執行以下操作:
rssFeedService.save(rssCategory);
可能您需要將此操作放入事務中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.