gpt4 book ai didi

java - JPA "The attribute matching the ID class attribute xxxxxxx does not have the correct type int"

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:56:01 33 4
gpt4 key购买 nike

我有一个 Java 实体类“Portfolio.java”,它有一个复合主键(portfolio_id、portfolio_name)。我使用@IdClass 创建复合主键。这两个是类(class)中唯一的实例。

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

现在,application_id 是“Application.java”类的实例,而 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();
}

.....
}

投资组合.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);
}

.....
}

应用程序.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”

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

感谢您的帮助! :)

最佳答案

这是一个“派生身份”——Portfolio 的 ID 是 Application ID 的一部分,它们之间存在多对一关系。要正确映射,您需要在 ApplicationPK 中有一个类型为 PortfolioPK 的属性,其名称与 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

// ...
}

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

关于java - JPA "The attribute matching the ID class attribute xxxxxxx does not have the correct type int",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34675496/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com