gpt4 book ai didi

java - 具有复合键的 @OneToOne 实体上的 JPA @Id

转载 作者:行者123 更新时间:2023-12-02 09:02:44 25 4
gpt4 key购买 nike

我有一个 @Entity 类,在同一字段上有一个 @Id 注释和一个 @OneToOne 注释。通常这不会成为问题,但带有这些注释的字段的实体类使用复合键。这导致的并发症比我预期的要多。

这是提出问题的实体类:

@Entity
public class ReportDetails implements Serializable {

@Id
@OneToOne
private MachineLine machineLine;
}

这是在 ReportDetails 中用作 ID 的 MachineLine 实体类:

@Entity
@IdClass(MachineLine.MachineLineKey.class)
public class MachineLine {

@Id
@ManyToOne
private Machine machine;

@Id
private long lineIndex;

public static class MachineLineKey implements Serializable {
private Machine machine;
private long lineIndex;
}
}

为了节省空间,我从这些类定义中省略了任何额外的字段以及 getter 和 setter。

当我尝试运行我的应用程序时,出现以下异常:

java.lang.IllegalArgumentException:此类 [类 ReportDetails] 未定义 IdClass

当我在 ReportDetails 上放置 @IdClass 注释时,它需要定义我在 @IdClass 中定义的任何类的各个字段,例如在MachineLine 中。但是,我试图避免这样做,而是在从数据库检索 ReportDetails 实体时返回整个 MachineLine 实体。

有没有办法将 MachineLine 作为 ReportDetails 的 ID 字段,而不必在 ReportDetails 中定义额外的字段?

最佳答案

这就是 JPA 所说的“派生身份”。你可以尝试这样的事情:

报告详细信息:

@Entity
public class ReportDetails implements Serializable {
// all attributes map by the relationship: AttributeOverride is not allowed
@EmbeddedId
private MachineLine.Id id;

@MapsId
@JoinColumns({
@JoinColumn(name="machineId", referencedColumnName="machineId"),
@JoinColumn(name="machineLineIndex", referencedColumnName="index")
})
@OneToOne
private MachineLine machineLine;

// ...
}

机器线:

@Entity
public class MachineLine {

@EmbeddedId
private Id id;

@MapsId("machineId") // maps machineId attribute of embedded id
@ManyToOne
private Machine machine;

// ...

@Embeddable
public static class Id implements Serializable {
private long machineId; // corresponds to PK type of Machine
private long index;
// ...
}
}

机器:

@Entity
public class Machine {

@Id
private long id;

@OneToMany(mappedBy = "machine")
private List<MachineLine> lines;

// ...
}

JPA 2.2 spec 中讨论了派生身份(并附有示例)在第 2.4.1 节中。

关于java - 具有复合键的 @OneToOne 实体上的 JPA @Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60042505/

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