Я собираю твиты на основе поиска в Твиттере и пытаюсь сохранить результаты в базе данных, используя Hibernate на Java.Когда я пытаюсь сохранить объект SearchResults, я получаю сообщение об ошибке, подобное следующему:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
Что мне нужно сделать, чтобы и TweetCluster.java, и SearchResults.java могли указывать на одну и ту же таблицутвитов в базе данных?Я мог бы изменить TweetCluster.java, чтобы он указывал на отдельную таблицу, в которой снова хранятся твиты, но это кажется пустой тратой.
Я вытащил важный код, как показано ниже.
@Entity
@Table(name="search_results")
public class SearchResults {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long searchId;
@ManyToMany(targetEntity = Tweet.class, cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@OrderColumn(name="orderIndex")
private List<Tweet> tweets;
@OneToMany(targetEntity = TweetCluster.class, cascade=CascadeType.ALL, fetch=FetchType.EAGER, orphanRemoval=true)
@OrderColumn(name="orderIndex")
private List<TweetCluster> clusters;
public SearchResults() {
tweets = new ArrayList<Tweet>();
clusters = new ArrayList<TweetCluster>();
}
public List<Tweet> getTweets() {
return tweets;
}
public void addTweet(Tweet tweet){
tweets.add(tweet);
}
public void addCluster(TweetCluster cluster){
clusters.add(cluster);
}
public List<TweetCluster> getClusters() {
return clusters;
}
}
@Entity
@Table(name="tweet_cluster")
public class TweetCluster {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
private String name;
@ManyToMany(targetEntity = Tweet.class, fetch=FetchType.EAGER)
@OrderColumn(name="orderIndex")
private List<Tweet> tweets;
public TweetCluster(){
tweets = new ArrayList<Tweet>();
}
public TweetCluster(String name){
this();
this.name=name;
}
public long getId(){
return id;
}
public void setId(long id){
this.id = id;
}
public List<Tweet> getTweets() {
return tweets;
}
public void addTweet(Tweet tweet){
tweets.add(tweet);
}
}
@Entity
@Table(name="tweet")
public class Tweet {
@Id
@GenericGenerator(name="assigned", strategy = "assigned")
private long tweetId;
private String text;
public Tweet(){
}
public long getTweetId() {
return tweetId;
}
public void setTweetId(long id){
this.tweetId = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
РЕДАКТИРОВАТЬ:
Чтобы сохранить результаты, я запускаю код, подобный следующему:
SearchResults searchResult = new SearchResults();
searchResult .addCluster(new TweetCluster("cluster1"));
searchResult .addCluster(new TweetCluster("cluster2"));
searchResult.addTweet(new Tweet("Tweet 1"));
searchResult.addTweet(new Tweet("Tweet 2"));
searchResult.addTweet(new Tweet("Tweet 3"));
session.saveOrUpdate(searchResult);
Исключение выдается вsaveOrUpdate