Hibernate @ManyToMany在插入的拥有方插入0

时间:2013-12-23 15:00:27

标签: java hibernate

有点麻烦试图找出如何让我的@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句柄返回所有目标的列表。

1 个答案:

答案 0 :(得分:0)

找到答案,希望这会有助于其他人。

我的数据库中的ID是自动增量(我知道,对此有各种各样的争论,但这是我必须使用的),所以一旦我将注释@GeneratedValue(strategy=GenerationType.IDENTITY)添加到Tweet的Id属性,一切开始工作了。