我有一个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"
这是正确的实施吗?还是应该以不同的方式完成?
感谢您的帮助! :)
答案 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 是您的情况)。