From 0aee6850d5e395725f36df91f767923c84cb5a34 Mon Sep 17 00:00:00 2001 From: Athou Date: Thu, 30 May 2013 10:24:30 +0200 Subject: [PATCH] use a onetomany relationship for push info to avoid hibernate automatic lazy loading of onetoone optional relationships --- src/main/java/com/commafeed/backend/dao/FeedDAO.java | 2 +- .../commafeed/backend/feeds/FeedRefreshUpdater.java | 3 ++- .../commafeed/backend/feeds/FeedRefreshWorker.java | 6 +++--- src/main/java/com/commafeed/backend/model/Feed.java | 11 ++++++----- .../com/commafeed/backend/model/FeedPushInfo.java | 4 ++-- .../backend/pubsubhubbub/SubscriptionHandler.java | 3 ++- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedDAO.java b/src/main/java/com/commafeed/backend/dao/FeedDAO.java index 28111b44..827e6b5a 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedDAO.java @@ -67,7 +67,7 @@ public class FeedDAO extends GenericDAO { List feeds = q.getResultList(); for (Feed feed : feeds) { - FeedPushInfo info = feed.getPushInfo(); + FeedPushInfo info = Iterables.getFirst(feed.getPushInfo(), null); if (info != null) { info.getTopic(); } diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java index c6b88a8a..9543724c 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java @@ -29,6 +29,7 @@ import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.pubsubhubbub.SubscriptionHandler; import com.commafeed.backend.services.ApplicationSettingsService; import com.commafeed.backend.services.FeedUpdateService; +import com.google.common.collect.Iterables; import com.google.common.util.concurrent.Striped; @Singleton @@ -157,7 +158,7 @@ public class FeedRefreshUpdater { } private void handlePubSub(final Feed feed) { - FeedPushInfo info = feed.getPushInfo(); + FeedPushInfo info = Iterables.getFirst(feed.getPushInfo(), null); if (info != null && info.isActive() == false) { new Thread() { @Override diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshWorker.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshWorker.java index 8188476f..eb3370d8 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshWorker.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshWorker.java @@ -18,6 +18,7 @@ import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedPushInfo; import com.commafeed.backend.services.ApplicationSettingsService; import com.commafeed.backend.services.FeedPushInfoService; +import com.google.common.collect.Iterables; import com.sun.syndication.io.FeedException; public class FeedRefreshWorker { @@ -85,7 +86,6 @@ public class FeedRefreshWorker { private void update(Feed feed) { - try { FetchedFeed fetchedFeed = fetcher.fetch(feed.getUrl(), false, feed.getLastModifiedHeader(), feed.getEtagHeader()); @@ -156,11 +156,11 @@ public class FeedRefreshWorker { topic = "http://" + topic; } log.debug("feed {} has pubsub info: {}", feed.getUrl(), topic); - FeedPushInfo info = feed.getPushInfo(); + FeedPushInfo info = Iterables.getFirst(feed.getPushInfo(), null); if (info == null) { info = feedPushInfoService.findOrCreate(feed, hub, topic); + feed.getPushInfo().add(info); } - feed.setPushInfo(info); } } diff --git a/src/main/java/com/commafeed/backend/model/Feed.java b/src/main/java/com/commafeed/backend/model/Feed.java index 36046775..bffca4fe 100644 --- a/src/main/java/com/commafeed/backend/model/Feed.java +++ b/src/main/java/com/commafeed/backend/model/Feed.java @@ -9,7 +9,6 @@ import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; -import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @@ -69,9 +68,11 @@ public class Feed extends AbstractModel { @Column(length = 255) private String etagHeader; - @OneToOne(fetch = FetchType.LAZY, mappedBy = "feed", cascade = { + @OneToMany(fetch = FetchType.LAZY, mappedBy = "feed", cascade = { CascadeType.PERSIST, CascadeType.MERGE }) - private FeedPushInfo pushInfo; + // use a onetomany relationship for push info to avoid hibernate automatic + // lazy loading of onetoone optional relationships + private Set pushInfo; @ManyToMany(mappedBy = "feeds") private Set entries = Sets.newHashSet(); @@ -183,11 +184,11 @@ public class Feed extends AbstractModel { this.lastUpdateSuccess = lastUpdateSuccess; } - public FeedPushInfo getPushInfo() { + public Set getPushInfo() { return pushInfo; } - public void setPushInfo(FeedPushInfo pushInfo) { + public void setPushInfo(Set pushInfo) { this.pushInfo = pushInfo; } diff --git a/src/main/java/com/commafeed/backend/model/FeedPushInfo.java b/src/main/java/com/commafeed/backend/model/FeedPushInfo.java index 1e5a36a5..656a1a31 100644 --- a/src/main/java/com/commafeed/backend/model/FeedPushInfo.java +++ b/src/main/java/com/commafeed/backend/model/FeedPushInfo.java @@ -4,7 +4,7 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; +import javax.persistence.ManyToOne; import javax.persistence.Table; import org.hibernate.annotations.Index; @@ -15,7 +15,7 @@ import org.hibernate.annotations.Index; public class FeedPushInfo extends AbstractModel { @JoinColumn(unique = true) - @OneToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY) private Feed feed; @Column(length = 2048, nullable = false) diff --git a/src/main/java/com/commafeed/backend/pubsubhubbub/SubscriptionHandler.java b/src/main/java/com/commafeed/backend/pubsubhubbub/SubscriptionHandler.java index 7a2bf472..817356d0 100644 --- a/src/main/java/com/commafeed/backend/pubsubhubbub/SubscriptionHandler.java +++ b/src/main/java/com/commafeed/backend/pubsubhubbub/SubscriptionHandler.java @@ -23,6 +23,7 @@ import com.commafeed.backend.feeds.FeedUtils; import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedPushInfo; import com.commafeed.backend.services.ApplicationSettingsService; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; public class SubscriptionHandler { @@ -37,7 +38,7 @@ public class SubscriptionHandler { FeedPushInfoDAO feedPushInfoDAO; public void subscribe(Feed feed) { - FeedPushInfo info = feed.getPushInfo(); + FeedPushInfo info = Iterables.getFirst(feed.getPushInfo(), null); String hub = info.getHub(); String topic = info.getTopic(); String publicUrl = FeedUtils