gpt4 book ai didi

java - 显式 Hibernate 连接表

转载 作者:搜寻专家 更新时间:2023-10-31 19:37:52 24 4
gpt4 key购买 nike

我有一个像 here 这样的 m:n 关系,除了有一些信息与 AuthorBook 实体相关联。所以我想,我根本不需要 @JoinTable 并且应该创建一个 class AuthorBook 包含一个指向每个 Author 的链接书和附加信息,对吗?

我试过了

@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 是“作者”,但它的“id”同样有效)。

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

最佳答案

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

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

在我的数据库中有一张表Rating,它提供了User和Movie之间的多对多关系,所以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;
}

为评级实现复合 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;
}
}

关于java - 显式 Hibernate 连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32544344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com