gpt4 book ai didi

java - 具有基本类继承的 JPA 映射

转载 作者:行者123 更新时间:2023-12-01 22:37:39 25 4
gpt4 key购买 nike

我有一个使用 JPA 映射的简单类:

@Entity
@Table(name = "SPONSOR")
public class Sponsor extends PersistableBusinessObjectBase implements SponsorContract {

@PortableSequenceGenerator(name = "SEQ_SPONSOR_CODE")
@GeneratedValue(generator = "SEQ_SPONSOR_CODE")
@Id
@Column(name = "SPONSOR_CODE")
private String sponsorCode;

@Column(name = "ACRONYM")
private String acronym;

@Column(name = "AUDIT_REPORT_SENT_FOR_FY")
private String auditReportSentForFy;

@Column(name = "CAGE_NUMBER")
private String cageNumber;

@Column(name = "COUNTRY_CODE")
private String countryCode;

@Column(name = "DODAC_NUMBER")
private String dodacNumber;

@Column(name = "DUN_AND_BRADSTREET_NUMBER")
private String dunAndBradstreetNumber;

@Column(name = "DUNS_PLUS_FOUR_NUMBER")
private String dunsPlusFourNumber;

@Column(name = "OWNED_BY_UNIT")
private String ownedByUnit;

@Column(name = "POSTAL_CODE")
private String postalCode;

@Column(name = "ROLODEX_ID")
private Integer rolodexId;

@Column(name = "SPONSOR_NAME")
private String sponsorName;

@Column(name = "SPONSOR_TYPE_CODE")
private String sponsorTypeCode;

@Column(name = "STATE")
private String state;

@Column(name = "CREATE_USER")
private String createUser;

@Column(name = "ACTV_IND")
@Convert(converter = BooleanYNConverter.class)
private boolean active;

@ManyToOne(cascade = { CascadeType.REFRESH })
@JoinColumn(name = "SPONSOR_TYPE_CODE", referencedColumnName = "SPONSOR_TYPE_CODE", insertable = false, updatable = false)
private SponsorType sponsorType;

@ManyToOne(cascade = { CascadeType.REFRESH })
@JoinColumn(name = "OWNED_BY_UNIT", referencedColumnName = "UNIT_NUMBER", insertable = false, updatable = false)
private Unit unit;

@ManyToOne(cascade = { CascadeType.REFRESH })
@JoinColumn(name = "ROLODEX_ID", referencedColumnName = "ROLODEX_ID", insertable = false, updatable = false)
private Rolodex rolodex;
....

我已将该类扩展为一个非常简单的类

@Entity
public class SponsorMaintainableBo extends Sponsor {
}

这正是我对 SponsorMaintainableBo 所需要的。它是 Sponsor 的副本,并且是从与 Sponsor 相同的表中读取的。这是通过一些 xml 文档控制的查询框架所必需的,并且需要成为我正在做的事情的单独对象。 SponsorMaintainableBo 需要插入到查询/维护框架中,以实现我们在主父文档中不需要的自定义详细信息。当我尝试使用 SponsorMaintainableBo 时,出现以下错误:

org.springframework.orm.jpa.JpaSystemException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'DTYPE' in 'field list'
Error Code: 1054
Call: SELECT SPONSOR_CODE AS a1, DTYPE AS a2, ACRONYM AS a3, ACTV_IND AS a4, AUDIT_REPORT_SENT_FOR_FY AS a5, CAGE_NUMBER AS a6, COUNTRY_CODE AS a7, CREATE_USER AS a8, DODAC_NUMBER AS a9, DUN_AND_BRADSTREET_NUMBER AS a10, DUNS_PLUS_FOUR_NUMBER AS a11, OBJ_ID AS a12, OWNED_BY_UNIT AS a13, POSTAL_CODE AS a14, ROLODEX_ID AS a15, SPONSOR_NAME AS a16, SPONSOR_TYPE_CODE AS a17, STATE AS a18, UPDATE_TIMESTAMP AS a19, UPDATE_USER AS a20, VER_NBR AS a21 FROM SPONSOR WHERE (DTYPE = ?) LIMIT ?, ?
bind => [3 parameters bound]
Query: ReadAllQuery(referenceClass=SponsorMaintainableBo sql="SELECT SPONSOR_CODE AS a1, DTYPE AS a2, ACRONYM AS a3, ACTV_IND AS a4, AUDIT_REPORT_SENT_FOR_FY AS a5, CAGE_NUMBER AS a6, COUNTRY_CODE AS a7, CREATE_USER AS a8, DODAC_NUMBER AS a9, DUN_AND_BRADSTREET_NUMBER AS a10, DUNS_PLUS_FOUR_NUMBER AS a11, OBJ_ID AS a12, OWNED_BY_UNIT AS a13, POSTAL_CODE AS a14, ROLODEX_ID AS a15, SPONSOR_NAME AS a16, SPONSOR_TYPE_CODE AS a17, STATE AS a18, UPDATE_TIMESTAMP AS a19, UPDATE_USER AS a20, VER_NBR AS a21 FROM SPONSOR WHERE (DTYPE = ?) LIMIT ?, ?"); nested exception is javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'DTYPE' in 'field list'
Error Code: 1054
Call: SELECT SPONSOR_CODE AS a1, DTYPE AS a2, ACRONYM AS a3, ACTV_IND AS a4, AUDIT_REPORT_SENT_FOR_FY AS a5, CAGE_NUMBER AS a6, COUNTRY_CODE AS a7, CREATE_USER AS a8, DODAC_NUMBER AS a9, DUN_AND_BRADSTREET_NUMBER AS a10, DUNS_PLUS_FOUR_NUMBER AS a11, OBJ_ID AS a12, OWNED_BY_UNIT AS a13, POSTAL_CODE AS a14, ROLODEX_ID AS a15, SPONSOR_NAME AS a16, SPONSOR_TYPE_CODE AS a17, STATE AS a18, UPDATE_TIMESTAMP AS a19, UPDATE_USER AS a20, VER_NBR AS a21 FROM SPONSOR WHERE (DTYPE = ?) LIMIT ?, ?
bind => [3 parameters bound]
Query: ReadAllQuery(referenceClass=SponsorMaintainableBo sql="SELECT SPONSOR_CODE AS a1, DTYPE AS a2, ACRONYM AS a3, ACTV_IND AS a4, AUDIT_REPORT_SENT_FOR_FY AS a5, CAGE_NUMBER AS a6, COUNTRY_CODE AS a7, CREATE_USER AS a8, DODAC_NUMBER AS a9, DUN_AND_BRADSTREET_NUMBER AS a10, DUNS_PLUS_FOUR_NUMBER AS a11, OBJ_ID AS a12, OWNED_BY_UNIT AS a13, POSTAL_CODE AS a14, ROLODEX_ID AS a15, SPONSOR_NAME AS a16, SPONSOR_TYPE_CODE AS a17, STATE AS a18, UPDATE_TIMESTAMP AS a19, UPDATE_USER AS a20, VER_NBR AS a21 FROM SPONSOR WHERE (DTYPE = ?) LIMIT ?, ?")
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:321)
at org.springframework.orm.jpa.DefaultJpaDialect.translateExceptionIfPossible(DefaultJpaDialect.java:120)

我不确定映射子类并继承所有 JPA 映射的最佳方法。请指教。

最佳答案

Here是一些关于JPA实体继承的信息。

您必须在实体上配置继承,仅扩展类是不够的。如果您想拥有SponsorMaintainableBo在单独的表中,然后注释 Sponsor实体 @Inheritance(strategy=TABLE_PER_CLASS) 。网上有很多配置不同类型继承的示例。

public enum InheritanceType {
SINGLE_TABLE,
JOINED,
TABLE_PER_CLASS
};

Unknown column 'DTYPE' in 'field list'意味着SINGLE_TABLE是默认继承类型,并且您的 JPA 提供程序正在查找(默认命名)列 DTYPE在目标表中,以确定实体的确切类型。

关于java - 具有基本类继承的 JPA 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26655846/

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