2013-12-23 27 views
1

想要弄清楚如何讓我的@ManyToMany映射在Dropwizard的Hibernate中工作(使用dropwizard-hibernate 6.2)。我已經嘗試了幾個在線示例。我試圖保留一個Twitter流,其中user_mentions被保存在一個包含Tweets表的m2m的Targets表中。到目前爲止,我所有的嘗試都是針對現有的Target和新的Tweet(並且由於我的業務規則,情況總是如此)。我會暫時顯示代碼,但是我遇到的一致性問題是,tweets_targets表在所有情況下都將target_id設置爲正確的值,但tweet_id設置爲0.Hibernate @ManyToMany在插入的擁有一方插入0

代碼基於文章在這裏:http://viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/

// Target class 
@Entity 
@Table(name="targets") 
public class Target { 
private long id; 
private List<Tweet> tweets = new ArrayList<Tweet>(); 
@Id 
    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id = id; 
    } 
@ManyToMany(mappedBy="targets",targetEntity=Tweet.class) 
    public List<Tweet> getTweets() { 
     return tweets; 
    } 
    public void setTweets(List<Tweet> tweets) { 
     this.tweets = tweets; 
    } 
} 

// Tweet class 
@Entity 
@Table(name="tweets") 
public class Tweet { 
    private long id; 
private List<Target> targets = new ArrayList<Target>(); 
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinTable(name = "targets_tweets", joinColumns = { 
     @JoinColumn(name = "tweet_id", nullable = false, updatable = false) }, 
     inverseJoinColumns = { @JoinColumn(name = "target_id", nullable = false, updatable = false) 
    }) 
    public List<Target> getTargets() { 
     return this.targets; 
    } 

    public void setTargets(List<Target> targets) { 
     this.targets = targets; 
     for(Target t: targets){ 
      t.getTweets().add(this); 
     } 
    } 
} 

一個新的鳴叫實際節約,其中從AbstractDao的繼承了DropWizard的DAO類來完成。相關的代碼是:由流API報告

public long create(Tweet tweet) { 
    tweet.setTargets(getTargets(tweet));  
    return persist(tweet).getId(); 
} 

@SuppressWarnings("unchecked") 
private List<Target> getTargets(Tweet tweet) { 
    String[] mentions = tweet.getUserMentions().split(","); 

    return namedQuery(Target.FIND_BY_HANDLE) 
      .setParameterList("handles", mentions).list(); 
} 

我命名查詢僅返回基於他們的Twitter處理所有我的目標的列表。

+0

'create(Tweet tweet)'方法中的'message'是什麼?打字錯誤 – ssssteffff

+0

,應該是推特。現在糾正。 – Paul

回答

0

找到了答案,希望這會幫助別人。

我的數據庫中的Id是自動增量的(我知道,這裏有各種各樣的爭論,但這是我必須處理的),所以一旦我將註釋@GeneratedValue(strategy=GenerationType.IDENTITY)添加到Tweet的Id屬性中,一切都開始工作。

+1

在這些情況下,人們不得不懷疑:爲什麼Hibernate沒有抱怨?我已經看到了更多的事情,但事情只是錯誤的,而Hibernate只是一直在徘徊。我的意思是定義一個完全針對錯誤實體的oneToMany映射。 – Gimby

+1

同意。我也很驚訝,數據庫沒有抱怨,B/C當我看着它試圖插入0作爲Id的INSERT查詢,並且我曾經使用過的大多數數據庫將嘔吐試圖插入一個數據庫生成領域。 – Paul