spring - org.hibernate.AnnotationException:xxx.UserPDO.jobTitleDetail 上的@OneToOne 或@ManyToOne 引用了一个未知实体:xxx.JobTitleData
问题描述
我们正在尝试从 Spring 4.3.5 迁移到 5.3.7。当更新的 Spring jar 被替换并启动 jboss 时,我们收到以下错误消息。
Invocation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.gehcit.cp.security.pdo.UserPDO.jobTitleDetail references an unknown entity: com.gehcit.cp.security.data.JobTitleData
检查网络后,我发现了一些建议,但没有一个能解决我的问题。此代码之前使用 Spring 4.3.5 + Hibernate 5.3.16 组合。但是,我现在得到了例外。我怀疑问题出在 context-infra.xml 或 Spring Hibernate 兼容性中。
上下文-infra.xml:
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="entityInterceptor">
<bean class="com.gehcit.cp.hibernate.LoggingInterceptor"/>
</property>
<property name="mappingLocations">
<list>
<value>classpath:com/gehcit/cp/infrastructure/persistence/hibernate/mappings/common/*.hbm.xml</value>
<value>classpath:com/gehcit/cp/infrastructure/persistence/hibernate/mappings/${databaseType}/*.hbm.xml</value>
</list>
</property>
<property name="annotatedClasses">
<list>
<value>com.gehcit.cp.security.pdo.UserPDO</value>
<value>com.gehcit.cp.security.pdo.MuActivityLogData</value>
<value>com.gehcit.cp.security.pdo.MuActivityLogTypeData</value>
<value>com.gehcit.cp.cem.event.pdo.CEMEventData</value>
<value>com.gehcit.cp.cem.subscription.pdo.SubscriptionData</value>
<value>com.gehcit.cp.cem.subscription.pdo.SubscriptionRunDateData</value>
<value>com.gehcit.cp.cem.subscriptiontype.pdo.SubscriptionTypeData</value>
</list>
</property>
<property name="packagesToScan">
<list>
<value>com.gehcit.cp.chart.data</value>
<value>com.gehcit.cp.chart.pdo</value>
<value>com.gehcit.cp.erx.data</value>
<value>com.gehcit.cp.event</value>
<value>com.gehcit.cp.kb.data</value>
<value>com.gehcit.cp.orders.data</value>
<value>com.gehcit.cp.datanormalization.data</value>
<value>com.gehcit.cp.reg.data</value>
<value>com.gehcit.cp.security.data</value>
<value>com.gehcit.cp.security.pdo.${databaseType}</value>
<value>com.gehcit.cp.scheduling.pdo.${databaseType}</value>
<value>com.gehcit.cp.cem.event.pdo</value>
<value>com.gehcit.cp.cem.subscription.pdo</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.transaction.jta.platform">org.hibernate.engine.transaction.jta.platform.internal.JBossAppServerJtaPlatform</prop>
<prop key="hibernate.transaction.coordinator_class">jta</prop>
<prop key="hibernate.jta.UserTransaction">java:jboss/UserTransaction</prop>
<prop key="hibernate.current_session_context_class">jta</prop>
<prop key="hibernate.default_schema">${hibernate.default_schema}</prop>
</props>
</property>
</bean>
即使我们注释“annotatedclasses”的第一行,第二个文件也会失败并出现同样的异常。我没有看到更新 Spring-orm 5.3.7 jar 中的“注释类”有任何变化。
有什么想法吗?
JobTitleData.java:
import java.math.BigDecimal;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.gehcit.cp.core.search.query.MappingType;
import com.gehcit.cp.core.search.query.PersistenceMappings;
import com.gehcit.cp.hibernate.PdoUtil;
import com.gehcit.cp.security.dto.JobTitle;
/**
* JobTitle generated by MyEclipse - Hibernate Tools
*/
@Entity
@Table(name = "JOBTITLE")
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name = "jobTitle")
public class JobTitleData implements java.io.Serializable {
private static final long serialVersionUID = 4021880971475295148L;
/**
* PDO properties
*/
public enum Property implements PersistenceMappings.MappingDetail {
jtid(BigDecimal.class, MappingType.PROPERTY),
description(String.class, MappingType.PROPERTY),
rcopiaMemberTypeMedlistsId(BigDecimal.class, MappingType.PROPERTY),
badPropertyName(null, null);
private final Class clazz;
private MappingType mappingType;
private Property(Class clazz, MappingType mappingType) {
this.clazz = clazz;
this.mappingType = mappingType;
}
public static Property get(String name) {
try {
return Enum.valueOf(Property.class, name);
} catch (Throwable t) {
return badPropertyName;
}
}
// PersistenceMappings.MappingDetail interface implementation
public String getName() {
return toString();
}
public boolean isAssociation() {
return (mappingType == null || mappingType == MappingType.PROPERTY) ? false : true;
}
public Class<?> getType() {
return clazz;
}
};
// Fields
private BigDecimal jtid;
private String description;
private BigDecimal rcopiaMemberTypeMedlistsId;
// Constructors
/** default constructor */
public JobTitleData() {
}
public JobTitleData(BigDecimal jtid) {
this.jtid = jtid;
}
// Property accessors
@Id
@Column(name = "JTID")
@XmlElement(name = "jobTitleID")
public BigDecimal getJtid() {
return this.jtid;
}
public void setJtid(BigDecimal jtid) {
this.jtid = jtid;
}
@Column(name = "DESCRIPTION")
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
@Column(name = "RCOPIAMEMBERTYPEMEDLISTSID")
public BigDecimal getRcopiaMemberTypeMedlistsId() {
return rcopiaMemberTypeMedlistsId;
}
}
用户PDO.java:
package com.gehcit.cp.security.pdo;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.NamedQueries;
import org.hibernate.annotations.NamedQuery;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.NativeQuery;
import com.gehcit.cp.security.data.JobTitleData;
/**
* User generated by MyEclipse - Hibernate Tools
*/
@NamedQueries(
@NamedQuery(
name = "getLoggedInUser",
query = "from UserPDO as u where u.loginname= :loginName"
)
)
@HibernateEntity(testEntity = false, mappings = {
@HibernateEntityMapping(type = HibernateMappingType.GENERIC)
})
@Entity
@Table(name = "USR")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.gehcit.cp.security.pdo.UserPDO")
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name = "userData")
public class UserPDO implements java.io.Serializable {
private static final long serialVersionUID = 7943380038873231725L;
/**
* The data access object for the <code>UserPDO<code>.
*/
private static GenericDataAccessObject<UserPDO> dao;
private static Logger log = Logger.getLogger(UserPDO.class);
/**
* This set contains all of the properties that are not associations to other objects.
*/
public static final Set<Property> COLUMNS = EnumSet.range(Property.loginname, Property.pmpRole);
/**
* This set contains all of the properties that are associations to other objects.
*/
public static final Set<Property> ASSOCIATIONS = EnumSet.range(Property.jobTitleDetail, Property.jobTitleDetail);
// Fields
private String loginname;
private String password;
private String grouplist;
private BigDecimal pvid;
private Date passchange;
private String rolelist;
private String lastname;
private String firstname;
private String middlename;
private BigDecimal homelocation;
private BigDecimal currentloc;
private BigDecimal activedept;
private String deanumber;
private String licnumber;
private String status;
private String phone;
private String authloclist;
private BigDecimal isrespprov;
private String genprop;
private String pidlist;
private BigDecimal specialty;
private BigDecimal loginattempts;
private BigDecimal globalid;
private String memberid;
private String subscriptionureg;
private String datakey;
private Date dbCreateDate;
private Date dbUpdatedDate;
private Date lastLoginDate;
private Date activationdate;
private Date expirationdate;
private String prescriberid;
private String npi;
private String upin;
private String data2000;
private String spi;
private BigDecimal jtid;
private JobTitleData jobTitleDetail;
private String mqicusername;
private DoctorFacilityPDO doctorFacilityDetail;
private String tocElectronicAddress;
private Boolean isEligibleProfessional;
private Boolean isCredentialed;
private BigDecimal pmpRole;
/**
* This enumeration maps a <code>UserPDO</code> property name. It is used
* by the <code>getDTO(...)</code> method to select the returned columns
* Any changes made to the contents of the PDO need to be reflected in this structure.
*
*/
public enum Property implements PersistenceMappings.MappingDetail {
/**
* The loginname property.
*/
loginname(String.class, false),
/**
* The password property.
*/
password(String.class, false),
/**
* The grouplist property.
*/
grouplist(String.class, false),
/**
* The pvid property.
*/
pvid(BigDecimal.class, false),
/**
* The passchange property.
*/
passchange(Date.class, false),
/**
* The jobtitle property.
*/
jobtitle(BigDecimal.class, false),
/**
* The rolelist property.
*/
rolelist(String.class, false),
/**
* The lastname property.
*/
lastname(String.class, false),
/**
* The firstname property.
*/
firstname(String.class, false),
/**
* The middlename property.
*/
middlename(String.class, false),
/**
* The homelocation property.
*/
homelocation(BigDecimal.class, false),
/**
* The currentloc property.
*/
currentloc(BigDecimal.class, false),
/**
* The activedept property.
*/
activedept(BigDecimal.class, false),
/**
* The deanumber property.
*/
deanumber(String.class, false),
/**
* The licnumber property.
*/
licnumber(String.class, false),
/**
* The status property.
*/
status(String.class, false),
/**
* The phone property.
*/
phone(String.class, false),
/**
* The authloclist property.
*/
authloclist(String.class, false),
/**
* The isrespprov property.
*/
isrespprov(BigDecimal.class, false),
/**
* The genprop property.
*/
genprop(String.class, false),
/**
* The pidlist property.
*/
pidlist(String.class, false),
/**
* The specialty property.
*/
specialty(BigDecimal.class, false),
/**
* The loginattempts property.
*/
loginattempts(BigDecimal.class, false),
/**
* The globalid property.
*/
globalid(BigDecimal.class, false),
/**
* The memberid property.
*/
memberid(String.class, false),
/**
* The subscriptionureg property.
*/
subscriptionureg(String.class, false),
/**
* The datakey property.
*/
datakey(String.class, false),
/**
* The dbCreateDate property.
*/
dbCreateDate(Date.class, false),
/**
* The dbUpdatedDate property.
*/
dbUpdatedDate(Date.class, false),
/**
* The lastLoginDate property.
*/
lastLoginDate(Date.class, false),
/**
* The activationdate property.
*/
activationdate(Date.class, false),
/**
* The expirationdate property.
*/
expirationdate(Date.class, false),
/**
* The prescriberid property.
*/
prescriberid(String.class, false),
/**
* The npi property.
*/
npi(String.class, false),
/**
* The upin property.
*/
upin(String.class, false),
/**
* The spi property
*/
spi(String.class, false),
/**
* The data2000 property.
*/
data2000(String.class, false),
mqicusername(String.class, false),
/**
* This is for the pmpRole
*/
pmpRole(BigDecimal.class, false),
/**
* The jobTitleChild property.
*/
jobTitleDetail(JobTitleData.class, true),
/**
* This is for the toc electroninc email address)
*/
tocElectronicAddress(String.class, false),
/**
* The enum returned when a bad property name is passed into the get(String) static helper.
*/
badPropertyName(null, false);
private final Class<?> clazz;
private boolean association;
private Property(Class<?> clazz, boolean association) {
this.clazz = clazz;
this.association = association;
}
// PersistenceMapping interface
public boolean isAssociation() {
return association;
}
public Class<?> getType() {
return clazz;
}
public String getName() {
return this.toString();
}
/**
* Helper that creates the enum from a string.
*
* @param name
* The status code string.
* @return The enum value or <code>BadErrorCode</code> if the status code parameter does not map to a
* <code>UserPDO</code> value.
*/
public static Property get(String name) {
try {
return Enum.valueOf(Property.class, name);
} catch (RuntimeException e) {
if (log.isDebugEnabled()) {
log.debug("Exception converting '" + name + "' to UserPDO.Property", e);
}
return badPropertyName;
}
}
}
/**
* Accessor for the <code>UserPDO</code> data access object.
*
* @return The <code>UserPDO</code> data access object.
*/
public static GenericDataAccessObject<UserPDO> getDAO() {
if (dao == null) {
dao = new GenericDataAccessObject<UserPDO>(log) {
// use an anonymous class since you don't need to derive from the abstract generic
};
}
return dao;
}
// Constructors
/** default constructor */
public UserPDO() {
}
/** minimal constructor */
public UserPDO(BigDecimal pvid) {
this.pvid = pvid;
}
// Property accessors
@Id
@Column(name = "PVID")
@XmlElement(name = "providerID")
public BigDecimal getPvid() {
return this.pvid;
}
public void setPvid(BigDecimal pvid) {
this.pvid = pvid;
}
@Column(name = "LOGINNAME")
@XmlElement(name = "loginName")
public String getLoginname() {
return this.loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
@Column(name = "PASSWORD")
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name = "GROUPLIST")
public String getGrouplist() {
return this.grouplist;
}
public void setGrouplist(String grouplist) {
this.grouplist = grouplist;
}
@Temporal(TemporalType.DATE)
@Column(name = "PASSCHANGE")
public Date getPasschange() {
return this.passchange;
}
public void setPasschange(Date passchange) {
this.passchange = passchange;
}
@Column(name = "JOBTITLE")
public BigDecimal getJobTitleID() {
return (jtid);
//return this.jobTitleDetail != null ? this.jobTitleDetail.getJtid() : null;
}
public void setJobTitleID(BigDecimal jtid) {
this.jtid = jtid;
// if (getJobTitleDetail() != null) {
// this.jobTitleDetail.setJtid(jobtitle);
// } else {
// this.setJobTitleDetail(new JobTitleData(jobtitle));
// }
}
@Column(name = "ROLELIST")
public String getRolelist() {
return this.rolelist;
}
public void setRolelist(String rolelist) {
this.rolelist = rolelist;
}
@Column(name = "LASTNAME")
@XmlElement(name = "lastName")
public String getLastname() {
return this.lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
@Column(name = "FIRSTNAME")
@XmlElement(name = "firstName")
public String getFirstname() {
return this.firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
@Column(name = "MIDDLENAME")
@XmlElement(name = "middleName")
public String getMiddlename() {
return this.middlename;
}
public void setMiddlename(String middlename) {
this.middlename = middlename;
}
@Column(name = "HOMELOCATION")
@XmlElement(name = "homeLocation")
public BigDecimal getHomelocation() {
return this.homelocation;
}
public void setHomelocation(BigDecimal homelocation) {
this.homelocation = homelocation;
}
@Column(name = "CURRENTLOC")
@XmlElement(name = "currentLocation")
public BigDecimal getCurrentloc() {
return this.currentloc;
}
public void setCurrentloc(BigDecimal currentloc) {
this.currentloc = currentloc;
}
@Column(name = "ACTIVEDEPT")
public BigDecimal getActivedept() {
return this.activedept;
}
public void setActivedept(BigDecimal activedept) {
this.activedept = activedept;
}
@Column(name = "DEANUMBER")
@XmlElement(name = "deaNumber")
public String getDeanumber() {
return this.deanumber;
}
public void setDeanumber(String deanumber) {
this.deanumber = deanumber;
}
@Column(name = "LICNUMBER")
@XmlElement(name = "licenseNumber")
public String getLicnumber() {
return this.licnumber;
}
public void setLicnumber(String licnumber) {
this.licnumber = licnumber;
}
@Column(name = "STATUS")
public String getStatus() {
return this.status;
}
public void setStatus(String status) {
this.status = status;
}
@Column(name = "PHONE")
public String getPhone() {
return this.phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Column(name = "AUTHLOCLIST")
@XmlElement(name = "authorizedLocationOfCares")
public String getAuthloclist() {
return this.authloclist;
}
public void setAuthloclist(String authloclist) {
this.authloclist = authloclist;
}
@Column(name = "ISRESPPROV")
public BigDecimal getIsrespprov() {
return this.isrespprov;
}
public void setIsrespprov(BigDecimal isrespprov) {
this.isrespprov = isrespprov;
}
@Column(name = "GENPROP")
public String getGenprop() {
return this.genprop;
}
public void setGenprop(String genprop) {
this.genprop = genprop;
}
@Column(name = "PIDLIST")
public String getPidlist() {
return this.pidlist;
}
public void setPidlist(String pidlist) {
this.pidlist = pidlist;
}
@Column(name = "SPECIALTY")
public BigDecimal getSpecialty() {
return this.specialty;
}
public void setSpecialty(BigDecimal specialty) {
this.specialty = specialty;
}
@Column(name = "LOGINATTEMPTS")
@XmlElement(name = "loginAttempts")
public BigDecimal getLoginattempts() {
return this.loginattempts;
}
public void setLoginattempts(BigDecimal loginattempts) {
this.loginattempts = loginattempts;
}
@Column(name = "GLOBALID")
public BigDecimal getGlobalid() {
return this.globalid;
}
public void setGlobalid(BigDecimal globalid) {
this.globalid = globalid;
}
@Column(name = "MEMBERID")
public String getMemberid() {
return this.memberid;
}
public void setMemberid(String memberid) {
this.memberid = memberid;
}
@Column(name = "SUBSCRIPTIONUREG")
public String getSubscriptionureg() {
return this.subscriptionureg;
}
public void setSubscriptionureg(String subscriptionureg) {
this.subscriptionureg = subscriptionureg;
}
@Column(name = "DATAKEY")
public String getDatakey() {
return this.datakey;
}
public void setDatakey(String datakey) {
this.datakey = datakey;
}
@Temporal(TemporalType.DATE)
@Column(name = "DB_CREATE_DATE")
public Date getDbCreateDate() {
return this.dbCreateDate;
}
public void setDbCreateDate(Date dbCreateDate) {
this.dbCreateDate = dbCreateDate;
}
@Temporal(TemporalType.DATE)
@Column(name = "DB_UPDATED_DATE")
public Date getDbUpdatedDate() {
return this.dbUpdatedDate;
}
public void setDbUpdatedDate(Date dbUpdatedDate) {
this.dbUpdatedDate = dbUpdatedDate;
}
@Temporal(TemporalType.DATE)
@Column(name = "LAST_LOGIN_DATE")
public Date getLastLoginDate() {
return this.lastLoginDate;
}
public void setLastLoginDate(Date lastLoginDate) {
this.lastLoginDate = lastLoginDate;
}
@Temporal(TemporalType.DATE)
@Column(name = "ACTIVATIONDATE")
public Date getActivationdate() {
return this.activationdate;
}
public void setActivationdate(Date activationdate) {
this.activationdate = activationdate;
}
@Temporal(TemporalType.DATE)
@Column(name = "EXPIRATIONDATE")
public Date getExpirationdate() {
return this.expirationdate;
}
public void setExpirationdate(Date expirationdate) {
this.expirationdate = expirationdate;
}
@Column(name = "PRESCRIBERID")
public String getPrescriberid() {
return this.prescriberid;
}
public void setPrescriberid(String prescriberid) {
this.prescriberid = prescriberid;
}
@XmlTransient
@ManyToOne(fetch = FetchType.LAZY, targetEntity = JobTitleData.class)
@JoinColumn(name = "JOBTITLE", insertable = false, updatable = false)
public JobTitleData getJobTitleDetail() {
return this.jobTitleDetail;
}
public void setJobTitleDetail(JobTitleData jobTitleDetail) {
this.jobTitleDetail = jobTitleDetail;
}
@Column(name = "DATA2000")
public String getData2000() {
return data2000;
}
public void setData2000(String data2000) {
this.data2000 = data2000;
}
@Column(name = "NPI")
public String getNpi() {
return npi;
}
public void setNpi(String npi) {
this.npi = npi;
}
@Column(name = "SPI")
public String getSpi() {
return spi;
}
public void setSpi(String spi) {
this.spi = spi;
}
@Column(name = "UPIN")
public String getUpin() {
return upin;
}
public void setUpin(String upin) {
this.upin = upin;
}
@Column(name = "MQIC_USER_NAME")
public String getMqicusername() {
return mqicusername;
}
public void setMqicusername(String mqicusername) {
this.mqicusername = mqicusername;
}
@Column(name = "TOCElectronicAddress")
public String getTocElectronicAddress() {
return tocElectronicAddress;
}
public void setTocElectronicAddress(String tocElectronicAddress) {
this.tocElectronicAddress = tocElectronicAddress;
}
@Column(name = "PMPRole")
public BigDecimal getPmpRole() {
return pmpRole;
}
public void setPmpRole(BigDecimal pmpRole) {
this.pmpRole = pmpRole;
}
@Transient
@XmlTransient
public DoctorFacilityPDO getDoctorFacilityDetail() {
return doctorFacilityDetail;
}
public void setDoctorFacilityDetail(DoctorFacilityPDO doctorFacilityDetail) {
this.doctorFacilityDetail = doctorFacilityDetail;
}
@Column(name = "IS_EP")
public Boolean isEligibleProfessional() {
if (isEligibleProfessional == null) {
isEligibleProfessional = Boolean.FALSE;
}
return (isEligibleProfessional);
}
public void setEligibleProfessional(Boolean isEligibleProfessional) {
this.isEligibleProfessional = isEligibleProfessional;
}
@Column(name = "IS_CREDENT")
public Boolean isCredentialed() {
if (isCredentialed == null) {
isCredentialed = Boolean.FALSE;
}
return isCredentialed;
}
public void setCredentialed(Boolean isCredentialed) {
this.isCredentialed = isCredentialed;
}
/**
* Retrieves the data transfer object that corresponds to this persistence object. There
* are no sub-query objects returned using this method.
* @return User DTO
*/
@Transient
@XmlTransient
public User getDTO() {
return getDTO(COLUMNS);
}
解决方案
推荐阅读
- c# - 将包含 DataSet 的 Object (var) 转换为实际的 DataSet
- c++ - 使用 std::map::extract 修改密钥
- javascript - 压缩字符串的算法
- c++ - 如何从传感器(RFID)获取原始数据?
- docker - 如果我运行 `docker run -i` 而不是 `docker run -it` 会发生什么
- javascript - 清除柏树测试中的日期字段
- sql - SELECT vs UPDATE,使用 ABS 函数时出现意外舍入
- java - RichTextFX 注释和属性正则表达式
- swift - TableView 中的 SectionIndexTitle
- javascript - 反应路由器 history.push() 不能从 history.listen() 工作