有点麻烦试图找出如何让我的@ManyToMany映射在Dropwizard中使用Hibernate工作(使用dropwizard-hibernate 6.2)。我已经尝试了几个在线示例。我正在尝试使用保存在Targets表中的user_mentions来保存一个twitter流,该表是使用Tweets表的m2m。到目前为止,我所有的尝试都是针对现有的目标和新的推文(并且由于我的业务规则,情况总是如此)。我会暂时显示代码,但我遇到的一致问题是tweets_targets表在所有情况下都会结束,target_id设置为正确的值,但tweet_id设置为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);
}
}
}
新推文的实际保存是在DAO类中完成的,该类继承自DropWizard中的AbstractDAO。相关代码是:
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();
}
我的命名查询只根据流API报告的twitter句柄返回所有目标的列表。
答案 0 :(得分:0)
找到答案,希望这会有助于其他人。
我的数据库中的ID是自动增量(我知道,对此有各种各样的争论,但这是我必须使用的),所以一旦我将注释@GeneratedValue(strategy=GenerationType.IDENTITY)
添加到Tweet的Id属性,一切开始工作了。