Hibernate JPA OneToOne关联,其中两个实体使用复合主键,但使用不同的列名?
我们正在尝试将Hibernate用于一个使用大量复合键的数据库,这给我们带来了很多麻烦。 不幸的是,我们无法更改模式,因此必须在字段之间进行大量额外的映射。我们仅限于使用JPA1.0和Hibernate3.3 最大的问题 到目前为止,我们所做的是使用2个值的组合键处理两个实体之间的一对一关联,其中表具有不同的名称 对于这些列(DB有一个命名约定,即在每列上都有一个特定于表的前缀。) 无论何时执行查询,都会出现以下异常:Hibernate JPA OneToOne关联,其中两个实体使用复合主键,但使用不同的列名?,hibernate,orm,jpa,composite-primary-key,legacy-database,Hibernate,Orm,Jpa,Composite Primary Key,Legacy Database,我们正在尝试将Hibernate用于一个使用大量复合键的数据库,这给我们带来了很多麻烦。 不幸的是,我们无法更改模式,因此必须在字段之间进行大量额外的映射。我们仅限于使用JPA1.0和Hibernate3.3 最大的问题 到目前为止,我们所做的是使用2个值的组合键处理两个实体之间的一对一关联,其中表具有不同的名称 对于这些列(DB有一个命名约定,即在每列上都有一个特定于表的前缀。) 无论何时执行查询,都会出现以下异常: Caused by: org.hibernate.TypeMismatchE
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;
这些表的两个类InvestorySueRenty和InvestorySueRemailEntity具有可选的@OneToOne关联
(在某些情况下,Investors在Investors Remail中没有匹配记录):
我试图通过对两个实体使用与@EmbeddedBleid相同的类,然后使用@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或@EmbeddeBleid的情况,而不是两者都使用的情况吗?)
我们最终遇到了其他问题,比如“实体映射中的重复列”,所以我们回到了这种方法,看看是否还有其他解决方法
有没有人有解决这个问题的办法?我环顾了StackOverflow,但没有遇到任何关联中使用的组合键具有不同名称的情况
注意:
即使尝试了下面的建议,我们仍然会得到以下错误:org.hibernate.MappingException:实体映射中的重复列:com.business.entity.InvestorSuerentity列:T090\U 091\U INVESTOR\U ID(应使用insert=“false”update=“false”进行映射)
我甚至从Investorisuerentity中删除了所有关联,但仍然遇到同样的问题。当我在复合键类中删除@Column注释时,错误才消失。当然,查询不起作用,因为investorId没有映射!我不明白Hibernate在哪里找到了“映射中的重复列”,因为除了复合键之外,我已经删除了对T090\U 091\U INVESTOR\U ID的所有提及
我们在InvestorySuerenty中还有其他关联,它们在相同的主键上进行连接,但关联的实体在其组合键中也有其他列。一旦您使用@EmbeddedId,您是否应该对所有实体使用它们?对于其他类,我们仍然使用@IdClass。但这又是如何导致“重复列”的呢 看来我为你的案子找到了一个有效的解决方案:
@Entity
public class InvestorIssuerEntity {
@EmbeddedId
private InvestorIssuerEntityPK investorIssuerEntityPK;
@OneToOne(optional=true, mappedBy="investorIssuerEntity")
private InvestorIssuerEmailEntity investorIssuerEmailEntity;
}
@Entity
public class InvestorIssuerEmailEntity {
@EmbeddedId @AttributeOverrides({
@AttributeOverride(name="investorId", column=@Column(name="T02_INV_ID")),
@AttributeOverride(name="issuerId", column=@Column(name="T02_ISS_ID"))
})
private InvestorIssuerEntityPK investorIssuerEntityPK;
@OneToOne(optional=true) @PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name="T02_ISS_ID", referencedColumnName="T01_ISS_ID"),
@PrimaryKeyJoinColumn(name="T02_INV_ID", referencedColumnName="T01_INV_ID")
})
private InvestorIssuerEntity investorIssuerEntity;
}
@Embeddable
public class InvestorIssuerEntityPK implements Serializable {
private static final long serialVersionUID = -1176248537673293674L;
@Column(name="T01_INV_ID")
private Long investorId;
@Column(name="T01_ISS_ID")
private Long issuerId;
}
它生成以下DDL,这似乎就是您要查找的:
create table InvestorIssuerEmailEntity (
T02_INV_ID bigint not null,
T02_ISS_ID bigint not null,
primary key (T02_INV_ID, T02_ISS_ID)
)
create table InvestorIssuerEntity (
T01_INV_ID bigint not null,
T01_ISS_ID bigint not null,
primary key (T01_INV_ID, T01_ISS_ID)
)
alter table InvestorIssuerEmailEntity
add constraint FKC2FBCC4E1E26612E
foreign key (T02_INV_ID, T02_ISS_ID)
references InvestorIssuerEntity
我想提及另一种方法:
- 赞成:两个实体都可以使用自己的PK类
- 缺点:1:1关系显示在一个具有1个条目的集合中
@OneToMany
@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 Set<InvestorIssuerEmailEntity> investorIssuerEmails;
@OneToMany
@JoinColumns(值={
@JoinColumn(name=“T090\u 091\u INVESTOR\u ID”,referencedColumnName=“T284\u INVESTOR\u ID”,nullable=false,insertable=false,updateable=false),
@JoinColumn(name=“T090\U 102\U发卡机构\U ID”,referencedColumnName=“T284\U发卡机构\U ID”,nullable=false,insertable=false,updateable=false)
})
@NotFound(action=NotFoundAction.IGNORE)
私人集合投资者;
非常感谢,我将对此进行测试,看看这是否解决了我们的问题。InvestorySueRenty在investorId+issuerId上加入了其他关联,但它们的组合键也有一个额外的列-我将看看这是否会导致“映射中的重复列”错误。jeff303:但我仍然遇到了问题。请参见我在上面编辑的问题中的注释。其他人能确认这解决了他们的问题吗?我不清楚您的最终代码是什么,所以,我无法帮助您确定问题所在。
@OneToMany
@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 Set<InvestorIssuerEmailEntity> investorIssuerEmails;