【问题标题】:JPA Bidirectionnal Uknown columnJPA 双向未知列
【发布时间】:2015-06-09 01:31:16
【问题描述】:

我有实体并且它们是单向的,所以我决定将它们设为双向,当它们是单向时一切都很好,但是当我将它们更改为双向时我遇到了一些问题!!!!

我有很多实体,但我只是参考一下,我在两个实体中遇到问题,一个是 OneToMany,另一个是 ManyToOne

第一个实体称为AgentOneToManyProject):

@Entity
public class Agent implements Serializable {
    private static final long serialVersionUID = 1047335572433032863L;
    @GeneratedValue
    @Id
    private int id;
    @Basic
    private String fistname;
    @Basic
    private String lastname;
    @ManyToOne
    private Department department;
    @OneToMany(mappedBy = "agent")
    private List<Project> project;

    //Setters and getters ...
}

第二个实体称为ProjectManyToOneAgent):

@Entity
public class Project implements Serializable {
    private static final long serialVersionUID = -6643569041998000573L;
    @GeneratedValue
    @Id
    private int id;
    @Basic
    private String crmCode;
    @Basic
    private String circuit;
    @Basic
    private String type;
    @Basic
    private String scope;
    @Basic
    @Temporal(TemporalType.DATE)
    private Date beginDate;
    @Basic
    @Temporal(TemporalType.DATE)
    private Date endDate;
    @ManyToOne
    private Agent agent;
    @ManyToOne
    private Service service;

    //Setters and getters
}

但是当我启动一些获取查询时,我得到了这个异常:

exception

javax.servlet.ServletException: javax.ejb.EJBException

root cause

javax.ejb.EJBException

root cause

javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'AGENT_ID' in 'field list'
Error Code: 1054
Call: SELECT ID, BEGINDATE, CIRCUIT, CRMCODE, ENDDATE, SCOPE, TYPE, AGENT_ID, SERVICE_ID FROM PROJECT WHERE (CRMCODE = ?)
    bind => [1 parameter bound]
Query: ReadAllQuery(referenceClass=Project sql="SELECT ID, BEGINDATE, CIRCUIT, CRMCODE, ENDDATE, SCOPE, TYPE, AGENT_ID, SERVICE_ID FROM PROJECT WHERE (CRMCODE = ?)")

root cause

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'AGENT_ID' in 'field list'
Error Code: 1054
Call: SELECT ID, BEGINDATE, CIRCUIT, CRMCODE, ENDDATE, SCOPE, TYPE, AGENT_ID, SERVICE_ID FROM PROJECT WHERE (CRMCODE = ?)
    bind => [1 parameter bound]
Query: ReadAllQuery(referenceClass=Project sql="SELECT ID, BEGINDATE, CIRCUIT, CRMCODE, ENDDATE, SCOPE, TYPE, AGENT_ID, SERVICE_ID FROM PROJECT WHERE (CRMCODE = ?)")

root cause

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'AGENT_ID' in 'field list'

这里我可以理解问题,JPA引用了数据库中不存在的AGENT_ID列,与Project中的字段service相同。

问题是为什么这个奇怪的错误?,当它创建对数据库的请求时,它不应该引用Agent.ID而不是AGENT_ID,我试图更改Agent实体中的id名称到AGENT_ID 使用@Column 但我遇到了同样的问题只是AGENT_AGENT_ID !!!!

任何人都知道如何解决这个问题,我在 glassfish,谢谢大家:)

【问题讨论】:

  • 根据堆栈跟踪,Project 表必须AGENT_ID 列。
  • 如果Project数据库表不包含代理ID的列,那么如何将项目与代理关联?忘掉Java吧,你需要先把你的数据库弄好。属性表应该有一个代理的外键,并且很可能应该称为 AGENT_ID。
  • 另外,你为什么使用@Basic 注释?最好使用@Column注解,比较标准。
  • @DuncanKinnear 我已经提到过,我用Agent 注释了Agent 实体的id,但我遇到了同样的问题,只是JPA 报告AGENT_AGENT_ID 不存在,对于@Basic,它自动生成,我使用 IntelliJ IDEA :)
  • @CycDemo 是的,我明白这一点,但正如你所见,我没有更改Agentid,我不明白这个奇怪的错误!!!跨度>

标签: java jakarta-ee jpa glassfish eclipselink


【解决方案1】:

我已经用 @Column(name = "AGENT_ID") 注释了代理实体的 ID,但我遇到了同样的问题,只是 JPA 报告说 AGENT_AGENT_ID 不存在

您所做的将更改Agent 表中的ID 列,但不会影响Project 表中的连接列。

你应该这样做:

class Project {
    //....

    @ManyToOne
    @JoinColumn(name="YOUR_AGENT_ID_COL_NAME");
    private Agent agent;
    //......
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    相关资源
    最近更新 更多