gpt4 book ai didi

java - 如何通过多重连接生成一些 JPA 实体?

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:33 25 4
gpt4 key购买 nike

我想在这种情况下创建一个应用程序:Zk 6、Spring v3.1.1、JPA 2.0、Hibernate 4.1.4,所有这些都带有注释,但我有一些带有 JPA 概念的 pb。

以下是一种案例研究:

3 个表,全部通过连接表链接;我们正在处理基数 0, n。

  • 所以我们有 T_E_USER、T_E_TYPE 和 T_E_AIR。每个表都有一个数字 ID 和一个简单的 VARCHAR 字段。

  • 使用 T_J_USR_TPE_AIR 创建连接表,其中 3 个 ID 被外键引用,形成组合主键。

我正在使用 Hibernate Tools 生成我的实体(JPA 版本)。这就是问题开始的地方......

在每个实体类中,我都有一个使用注释 @OneToMany 设置类型的属性。

我有一个表示连接的类,该类具有复杂类型(另一个类)的 id 属性,并带有用于组合键的注释 EmbeddedId。以及代表三个实体的属性,带有注释 @ManyToOne。

这是我的问题,因为这就是我感到困惑的地方:

  • 我应该将哪个设置到我的实体的注释 @ OneToMany 中的“mappedBy”属性中?
  • 我是否被迫创建一个代表连接的类实体?
  • CASCADE 如何运作?是否可以在这种情况下使用它来“自动”丰富连接表?或者我应该手动实例化连接的类代表以便自己保存信息?

提前非常感谢任何可以向我伸出援助之手的好心人。

<小时/>

感谢您的回答,但当另一个人说“不”时,一个人说"is",哈哈

这是我白天所做的事情,但尚未经过测试。

在每个实体表中,我添加了一个@OneToMany关系,并将mappedBy设置为“join”实体中定义的属性:

@OneToMany(fetch = FetchType.LAZY, 
mappedBy = "aircraft",
cascade = { CascadeType.REMOVE })
private Set<UserConfig> userConfigs = new HashSet<UserConfig>(0);

...

@OneToMany(fetch = FetchType.LAZY, 
mappedBy = "userAccount",
cascade = { CascadeType.REMOVE })
private Set<UserConfig> userConfigs = new HashSet<UserConfig>(0);

...

@OneToMany(fetch = FetchType.LAZY, 
mappedBy = "referenceType",
cascade = { CascadeType.REMOVE })
private Set<UserConfig> userConfigs = new HashSet<UserConfig>(0);

我为连接表创建了一个新实体。

@Entity
@Table(name = "T_J_USR_RFT_AIR_URA")
public class UserConfig implements java.io.Serializable {

@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "airId",
column = @Column(name = "URA_AIR_ID", nullable = false)),
@AttributeOverride(name = "usrId",
column = @Column(name = "URA_USR_ID", nullable = false)),
@AttributeOverride(name = "rftId",
column = @Column(name = "URA_RFT_ID", nullable = false))
})
private UserConfigId id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "URA_RFT_ID", nullable = false, insertable = false, updatable = false)
private ReferenceType referenceType;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "URA_USR_ID", nullable = false, insertable = false, updatable = false)
private UserAccount userAccount;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "URA_AIR_ID", nullable = false, insertable = false, updatable = false)
private Aircraft aircraft;

...
getter & setter
}

其中 UserConfigId 是:

@Embeddable
public class UserConfigId implements java.io.Serializable {

@Column(name = "URA_AIR_ID", nullable = false)
private Integer airId;

@Column(name = "URA_USR_ID", nullable = false)
private Integer usrId;

@Column(name = "URA_RFT_ID", nullable = false)
private Integer rftId;

...
getter & setter
}

您对这种做法有何看法?

如果删除连接表的对象以删除连接中关联的所有元素,我只是使用“级联”。

还好吗?

无论如何,谢谢你汤姆,我会分析你的链接。也谢谢 JMelnyk。

如果您想演示此案例的最佳实践,我们欢迎您。

最佳答案

三路连接很棘手。我认为您所做的,使用连接表的实体,可能是正确的做法。回答您的问题:

  1. 您的@OneToMany属性引用映射连接表的实体;它们应该是该实体中适当的@ManyToOne属性的mappedBy
  2. 是的,不幸的是,连接表的实体是实现此目的的最佳方法。
  3. 级联可用于自动将对象添加到数据库,但不能创建对象。您将需要在代码中创建连接实体的实例。

关于java - 如何通过多重连接生成一些 JPA 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837081/

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