JPA"与ID类属性xxxxxxx匹配的属性没有正确的类型int"

时间:2016-01-08 11:03:30

标签: java jpa foreign-key-relationship composite-primary-key

我有一个Java实体类" Portfolio.java",它有一个复合主键(portfolio_id,portfolio_name)。我使用@IdClass来创建复合主键。这两个是班上唯一的例子。

我有另一个类" Application.java",还有复合主键(application_id,portfolio_id)。我再次使用@IdClass创建复合主键。

现在,application_id是" Application.java"的一个实例。 class,而portfolio_id是" Portfolio.java"中对应实例的外键。类。

有没有人知道如何使用Java实现这个?

我尝试过以下操作,

PortfolioPK.java:

import java.io.Serializable;

public class PortfolioPK implements Serializable {

public int portfolio_id;
public int portfolio_name;

public PortfolioPK() {
    super();
}

@Override
public boolean equals(Object obj) {
    return super.equals(obj);
}

@Override
public int hashCode() {
    return super.hashCode();
}

.....
}

Portfolio.java:

@Entity
@IdClass(PortfolioPK.class)
public class Portfolio {

@Id
private int portfolio_id;
@Id
private int portfolio_name;

.....
}

ApplicationPK.java

import java.io.Serializable;

public class ApplicationPK  implements Serializable {

public int application_id;
public int portfolio_id;
public int portfolio_name;

public ApplicationPK() {
    super();
}

@Override
public boolean equals(Object obj) {
    return super.equals(obj);
}

.....
}

Application.java

@Entity
@IdClass(ApplicationPK.class)
public class Application {

@Id
private int application_id;
private String application_name;
private String app_properties;

@Id
@ManyToOne(cascade=CascadeType.ALL) 
@JoinColumn(name="portfolio_id", referencedColumnName="portfolio_id")
private Portfolio portfolio_id;

.....
}

所以,现在我在" Application.java"中的@IdClass声明中得到一个错误。错误是,"与ID类属性portfolio_id匹配的属性没有正确的类型int"

这是正确的实施吗?还是应该以不同的方式完成?

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:1)

这是“派生身份” - Portfolio的ID是Application ID的一部分,它们之间存在多对一关系。要正确映射,您需要在PortfolioPK中具有ApplicationPK类型的属性,其名称与Application中的关系属性相同。所以:

@Entity
@IdClass(ApplicationPK.class)
public class Application {

    @Id
    private int application_id;
    // No fields referring to Portfolio ID fields

    @Id
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="portfolio_id", referencedColumnName="portfolio_id")
    private Portfolio portfolio; // name it simply "portfolio"

    // ...
}

public class ApplicationPK  implements Serializable {

    public int application_id; // name matches the field in Application
    public PortfolioPK portfolio; // name matches the relationship field in Application

    // ...
}

有关更多详细信息和示例,请参阅{{3>}的“2.4.1对应于派生身份的主键”部分(示例2 是您的情况)。