显式的Hibernate联接表

5
我有一个类似于这里的m:n关系,但是需要将一些信息与AuthorBook实体相关联。因此,我认为根本不需要使用@JoinTable,而应该创建一个AuthorBook类,其中包含对每个AuthorBook的链接以及其他信息,对吗?
我尝试了以下方法:
@Entity
public class AuthorBook {
    @Id @ManyToOne Author author;
    @Id @ManyToOne Book book;
    @LobOrWhatever AdditionalInformation additionalInformation;
}

我遇到了问题(具体的我已经记不清了)。所以我引入了一个@GeneratedId int id并将引用更改为@NaturalId。这个方法大部分情况下都有效,但有趣的是,它强制我将已连接的AuthorBook传递给Session#byNaturalId,这对我来说毫无意义(我有id,而且实体应该一起获取)。我也尝试过其他方法。

session.byNaturalId(AuthorBook.class)
     .using("author.id", someAuthorId)
     .using("book.id", someBookId)
     .load();

但是被拒绝了,告诉我"author.id"不是自然id(实际上这是正确的,因为自然id是"author",但它的"id"同样有效)。

看着网上的资料,我发现每个人在这样的表中都使用id而不是实体,所以我想知道我是否在尝试一些不可能的事情...(或者很愚蠢)。

2个回答

7

更新: 删除了不必要的@AssociationOverrides。添加了@ManyToOne(fetch = FetchType.LAZY)以避免在cascade修改时出现StackOverflowException

我最近也遇到了类似的问题。 我通过使用@EmbededId找到了解决方案。

在我的数据库中,有一个名为Rating的表,它提供了用户和电影之间的多对多关系,因此userId和movieId是外键并形成复合主键。此表还包含一些附加信息。

这是我的代码,希望能对你有所帮助:

电影:

@Entity
@Table(name = "movie")
public class Movie {
    @Id
    @Column(name = "movie_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.movie")
    private List<Rating> ratings;
}

用户:

@Entity
@Table(name = "imdb_user")

public class User {   
    @Id
    @Column(name = "imdb_user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.user")
    private List<Rating> ratings;
}

评级:
@Entity
@Table(name = "rating")
public class Rating {
    @EmbeddedId
    private RatingId primaryKey = new RatingId();

    @Column(name = "rating_value")
    private Integer ratingValue;
}

实用类,实现了Rating的复合ID:

@Embeddable
public class RatingId implements Serializable{

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "movie_id")
    private Movie movie;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "imdb_user_id")
    private User user;

    /*Generated by IDEA*/
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        RatingId ratingId = (RatingId) o;

        if (movie != null ? !movie.equals(ratingId.movie) : ratingId.movie != null) return false;
        return !(user != null ? !user.equals(ratingId.user) : ratingId.user != null);

    }

    @Override
    public int hashCode() {
        int result = movie != null ? movie.hashCode() : 0;
        result = 31 * result + (user != null ? user.hashCode() : 0);
        return result;
    }
}

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接