想要弄清楚如何讓我的@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處理所有我的目標的列表。
'create(Tweet tweet)'方法中的'message'是什麼?打字錯誤 – ssssteffff
,應該是推特。現在糾正。 – Paul