Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate JPA OneToOne关联,其中两个实体使用复合主键,但使用不同的列名?_Hibernate_Orm_Jpa_Composite Primary Key_Legacy Database - Fatal编程技术网

Hibernate JPA OneToOne关联,其中两个实体使用复合主键,但使用不同的列名?

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

我们正在尝试将Hibernate用于一个使用大量复合键的数据库,这给我们带来了很多麻烦。 不幸的是,我们无法更改模式,因此必须在字段之间进行大量额外的映射。我们仅限于使用JPA1.0和Hibernate3.3

最大的问题 到目前为止,我们所做的是使用2个值的组合键处理两个实体之间的一对一关联,其中表具有不同的名称 对于这些列(DB有一个命名约定,即在每列上都有一个特定于表的前缀。)

无论何时执行查询,都会出现以下异常:

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关系并将相关实体存储在集合中。该集合将有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;