我们正在尝试将 Hibernate 与数据库一起使用,该数据库使用lot复合键的使用一直让我们很头疼。
不幸的是,我们无法更改架构,因此我们必须在字段之间进行大量额外的映射。我们仅限于使用 JPA 1.0 和 Hibernate 3.3。
最大的问题
到目前为止,我们使用 2 个值的复合键来处理两个实体之间的一对一关联,其中表具有不同的名称
对于这些列(数据库的命名约定是在每列上都有特定于表的前缀。)
每当我们执行查询时,都会收到此异常:
Caused by: org.hibernate.TypeMismatchException Provided id of the wrong type for class com.business.entity.InvestorIssuerEmailEntity.
Expected: class com.business.entity.InvestorIssuerEmailEntityPK, got class com.business.entity.InvestorIssuerEntityPK;
这些表的两个类 InvestorIssuerEntity 和 InvestorIssuerEmailEntity 有一个可选的 @OneToOne 关联
(某些情况下 InvestorIssuer 在 InvestorIssuerEmail 中没有匹配记录):
@IdClass(InvestorIssuerEntityPK.class)
@Table(name = "T090_INVESTOR_ISSUER")
@Entity
InvestorIssuerEntity
@Column(name = "T090_091_INVESTOR_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long investorId;
@Column(name = "T090_102_ISSUER_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long issuerId;
(other fields omitted)
@OneToOne(optional = true)
@JoinColumns(value = {
@JoinColumn(name="T090_091_INVESTOR_ID", referencedColumnName = "T284_INVESTOR_ID", nullable = false, insertable = false, updatable = false),
@JoinColumn(name = "T090_102_ISSUER_ID", referencedColumnName = "T284_ISSUER_ID", nullable = false, insertable = false, updatable = false)
})
@NotFound(action = NotFoundAction.IGNORE)
private InvestorIssuerEmailEntity investorIssuerEmail;
...
InvestorIssuerEntityPK
@Id
@Column(name = "T090_091_INVESTOR_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
private Long investorId;
@Id
@Column(name = "T090_102_ISSUER_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
private Long issuerId;
...
@IdClass(InvestorIssuerEmailEntityPK.class)
@Table(name = "T284_INVESTOR_ISSUER_EMAIL")
@Entity
InvestorIssuerEmailEntity
@Column(name = "T284_INVESTOR_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long investorId;
@Column(name = "T284_ISSUER_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long issuerId;
...
InvestorIssuerEmailEntityPK
@Column(name = "T284_INVESTOR_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long investorId;
@Column(name = "T284_ISSUER_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long issuerId;
我尝试通过使用与两个实体的 @EmbeddableId 相同的类,然后使用 @AttributeOverrides 来解决类型不匹配问题,如下所示:
@Id
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "investorId",
column = @Column(name = "T284_INVESTOR_ID", nullable = false, insertable = true, updatable = true, length = 18, precision = 0)),
@AttributeOverride(name = "issuerId",
column = @Column(name = "T284_ISSUER_ID", nullable = false, insertable = true, updatable = true, length = 18, precision = 0))
})
private InvestorIssuerId investorIssuerId;
我只对这两个实体进行了更改,但仍然对其他实体使用 @IdClass 方法(是否是仅对您的实体使用 @IdClass 或 @EmbeddableId,而不是两者都使用的情况?)
我们最终遇到了其他问题,例如“实体映射中的重复列”,因此我们恢复了这种方法,看看是否有其他解决方法。
有没有人有任何解决方案来解决这个问题?我查看了 StackOverflow,但没有遇到关联中使用的复合键具有不同名称的情况。
Note:即使尝试下面的建议后,我们仍然收到此错误:org.hibernate.MappingException:实体映射中的重复列:com.business.entity.InvestorIssuerEntity列:T090_091_INVESTOR_ID(应使用 insert="false" update="false 进行映射”)
我什至从 InvestorIssuerEntity 中删除了所有关联,并且still遇到了同样的问题。当我删除复合键类中的 @Column 注释时,该错误才消失。当然,查询不起作用,因为投资者 ID 没有映射!我不明白whereHibernate 正在查找“映射中的重复列”,因为除了复合键之外,我已经删除了所有提到的 T090_091_INVESTOR_ID 。
我们在 InvestorIssuerEntity 中还有其他关联,它们对相同的主键进行联接,但关联实体的组合键中也有附加列。一旦使用@EmbeddedId,您是否应该将它们用于所有实体?我们仍然对其他类使用@IdClass。但这是如何导致任何地方出现“重复列”的呢?