gpt4 book ai didi

Java JPA 一对多

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:26:31 25 4
gpt4 key购买 nike

我最近发布了一些关于填充 JTable 的帖子,现在它已经完全可用了。然而,我现在被其他事情困住了,我希望通过这个线程实现两个特定的目标。

一个是解决我的问题,另一个是当其他人遇到同样的问题时准备好答案,因为我还没有找到合适的答案。

我有以下场景

两个表:

游戏
id pk 整数
流派诠释
标题 varchar ....

类型
id pk 整数
名称 varchar ..

一个游戏只能有一个流派,但一个流派可以包含很多游戏。

我使用 Eclipse 作为我的 IDE,使用 eclipselink 作为我的 JPA 供应商。

我已经使用 eclipse 提供的实体向导生成了类,它还允许我定义两个表之间的关系。

关系如下:

@Entity
@Table(name="games")
public class Game implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Column(name="Id", unique=true, nullable=false)
private int id;

@Temporal( TemporalType.DATE)
@Column(name="AddDate", nullable=false)
private Date addDate;

@Lob()
@Column(name="Description", nullable=false)
private String description;

@Temporal( TemporalType.DATE)
@Column(name="ModifiedDate", nullable=false)
private Date modifiedDate;

@Temporal( TemporalType.DATE)
@Column(name="ReleaseDate", nullable=false)
private Date releaseDate;

@Column(name="Title", nullable=false, length=255)
private String title;

//bi-directional many-to-one association to Genre
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="Genre", nullable=false)
private Genre genreBean;

//bi-directional many-to-one association to Publisher
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="Publisher", nullable=false)
private Publisher publisherBean;

流派

@Entity
@Table(name="genres")
public class Genre implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Column(name="Id", unique=true, nullable=false)
private int id;

@Column(name="Genre", nullable=false, length=150)
private String genre;

//bi-directional many-to-one association to Game
@OneToMany(mappedBy="genreBean")
private List<Game> games;

我使用以下选择所有游戏

        List<Game> games;

try{
TypedQuery<Game> selectGamesQuery = entityManager.createQuery("SELECT g FROM Game g", Game.class);
games = selectGamesQuery.getResultList();
} catch(Exception e) {
games = null;
System.out.println(e);

这里的问题是,List games 不包含流派名称,实际上它是空的。

如何配置列表以包含具有以下属性的游戏:id、title、genre-name、publisher-name、releaseate

在我的 JTable 中,我尝试了以下操作:

        switch(columnIndex){
case 0:
return game.getTitle();
case 1:
return game.getPublisherBean().getPublisher();
case 2:
return game.getGenreBean().getGenre();
case 3:
return game.getReleaseDate();
}

在这种情况下,在我的 JTable 中,案例 1 和案例 2 的列为空,而其余列有效。

所以我的表格内容看起来像

Battlefield 3 empty empty 3-3-2011

我认为我应该提供足够的信息。

如果代码或选择查询中有任何错误或错误,请告诉我,因为我什至找不到是否必须编写显式 JOIN 查询并且由于定义的原因它不会这样做关系。

我还是菜鸟,所以请温柔点^^

感谢您的宝贵时间。

最佳答案

为了更接近问题,您可以通过在 persistence.xml(在 persistence-unit 元素内)中添加以下内容来启用细粒度的 JPA 日志记录:

<properties>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>

然后查看您的日志文件并查看 jpql-query 是如何转换为 sql 的。

另一个想法(可能听起来很愚蠢!):你是在数据库中也设置了外键约束,还是只在持久单元中设置了外键约束?

希望对你有帮助

关于Java JPA 一对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5181338/

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