2015-09-12 15 views
5

Tôi đang có một mối quan hệ m: n như here, ngoại trừ việc có một số thông tin liên quan đến thực thể AuthorBook. Vì vậy, tôi đoán, tôi không cần @JoinTable chút nào và nên tạo một số class AuthorBook bao gồm một liên kết cho mỗi AuthorBook và thông tin bổ sung, phải không?Rõ ràng Hibernate tham gia bàn

Tôi đã thử nó như

@Entity 
public class AuthorBook { 
    @Id @ManyToOne Author author; 
    @Id @ManyToOne Book book; 
    @LobOrWhatever AdditionalInformation additionalInformation; 
} 

và tôi chạy vào vấn đề (Tôi không thể nhớ chính xác nữa). Vì vậy, tôi đã giới thiệu một @GeneratedId int id và thay đổi các tham chiếu đến @NaturalId. Điều này hoạt động chủ yếu là tốt, nhưng vui vẻ, nó buộc tôi phải vượt qua đính kèm AuthorBook đến Session#byNaturalId mà không có ý nghĩa với tôi (tôi có id và các thực thể nên được lấy cùng nhau). Tôi cũng đã cố gắng

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

nhưng điều này đã bị từ chối nói với tôi rằng "author.id" là không có id tự nhiên (mà thực sự đúng như id tự nhiên là "tác giả", nhưng nó "id" làm việc tốt như nhau).

Nhìn vào trang web, tôi thấy mọi người sử dụng id thay vì các thực thể trong bảng như vậy, vì vậy tôi tự hỏi nếu tôi đang cố gắng điều gì đó không thể .... (hoặc ngu ngốc).

Trả lời

5

UPD: Đã xóa không cần thiết @AssociationOverrides. Đã thêm @ManyToOne(fetch = FetchType.LAZY) để tránh StackOverflowException trên cascade sửa đổi.

Gần đây tôi đã gặp sự cố tương tự. Tôi đã tìm thấy giải pháp của mình với @EmbededId.

Trong cơ sở dữ liệu của tôi có bảng Xếp hạng cung cấp mối quan hệ nhiều-nhiều giữa Người dùng và Phim, do đó userId và movieId là khóa ngoài và tạo thành khóa chính kết hợp. Và bảng này cũng chứa một số thông tin bổ sung.

Ở đây mã của tôi, tôi hy vọng nó sẽ giúp bạn:

Movie:

@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; 
} 

User:

@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; 
} 

Đánh giá:

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

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

lớp Utility mà cụ id tổng hợp cho R ating:

@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; 
    } 
} 
Các vấn đề liên quan