Id 列来自其他表 JPA 实体

Posted

技术标签:

【中文标题】Id 列来自其他表 JPA 实体【英文标题】:Id column comes from other table JPA entities 【发布时间】:2011-10-19 13:35:54 【问题描述】:

我的数据库中有两个表。带有 ID 和其他一些列的 Table1。 Table2 是一个关系表,其中我将 table1 中的 PK 作为 table2 中的 id,但我在 Table2 中没有使用 ID,它保存了一些其他随机数据的值。

在 JPA 中,您必须使用 @Id 注释。我的问题是我想使用 table1 的实体作为 table2 实体的@Id。这可能吗?如果可以,那怎么办?

到目前为止的代码: 表一

@Entity
@Table(name="Log", schema="logs")
@PersistenceUnit(name="domas")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="type", discriminatorType = DiscriminatorType.STRING)
public abstract class Log implements Serializable 

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="id", nullable=false)
    public String id;

    @Column(name="type", nullable=false)
    @Enumerated(EnumType.STRING)
    public LOG_TYPE type;
// and alot more not related code

表 2

@Entity
@Table(name="Log_Entity", schema="relations")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "relationType", discriminatorType  = DiscriminatorType.STRING)
public abstract class LogRelation implements Serializable 

    private static final long serialVersionUID = 1L;

    @Id
    @OneToOne(mappedBy="id")
    public Log log;

// and alot more not related code

【问题讨论】:

您是否要创建另一个表的表 ID?或者您是否尝试从一个表中选择一些字段并尝试为另一个表形成一个复合主键?如果是,那么您应该查看注释 @Embeddable@EmbeddedId 我只是想将 PK 从 Table1 获取到 Table2 中,这样我就不必在 table2 实体上声明 Id 注释,因为我在 Table2 中没有真正的 ID 列,只有一个 refId从表 1。但是 JPA 强迫我使用 Id-annotation 所以我试图解决它 【参考方案1】:

如果您没有带有属性名称 id 和类型 LogRelation 的 @OneToOne 反面,则此 mappedBy 没有意义:

@OneToOne(mappedBy="id")

跟着它会起作用:

@Id
@JoinColumn(name="lr_id")//or whatever column name you prefer
@OneToOne
Log log;

【讨论】:

这个类 [class com.foo.bar] 没有定义 IdClass 将被生成。 我想知道这种类型的 Id 是否有效,我读过 @Id 只能用于原语、包装器、字符串、日期、数组,但不能用于其他实体。我不确定,但我猜如果你使用其他实体,你应该覆盖equals和hashCode,如果正确请告诉我。【参考方案2】:

您的意思是“复合身份”,其中一个对象的身份是另一个对象的身份(部分)。 http://www.datanucleus.org/products/accessplatform_3_0/jpa/orm/compound_identity.html#1_1_uni

【讨论】:

以上是关于Id 列来自其他表 JPA 实体的主要内容,如果未能解决你的问题,请参考以下文章

来自具有非唯一 ID 的表的 JPA 实体

在spring数据jpa中获取非表实体的数据

Spring Boot JPA:将一个实体映射到具有相同列的多个(很多)表

jpa 多对多,带有附加列和复合键

JPA 实体,如何连接表

Spring JPA,Hibernate 仅从其他实体获取 PK 或 Id