Как связать несколько таблиц с элементами из одной таблицы, используя Hibernate? - PullRequest
0 голосов
/ 03 апреля 2012

Я собираю твиты на основе поиска в Твиттере и пытаюсь сохранить результаты в базе данных, используя 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

1 Ответ

0 голосов
/ 05 апреля 2012

Оказывается, проблема была действительно простой. Генератор для твита назначен. В моем модульном тесте я забыл назначить идентификатор. Таким образом, несколько твитов имели нулевой идентификатор.

...