简体   繁体   English

JPA:名称的命名查询:…未找到

[英]JPA: Named Query of name: … not found

I'm developing a multitenacy application with JPA at my company. 我正在公司使用JPA开发多租户应用程序。 So I use the TABLE_PER_TENANT feature to separate the tenant specific data into different schemas. 因此,我使用TABLE_PER_TENANT功能将特定于租户的数据分为不同的架构。 Pushing the data into the DB is no problem, that works fine. 将数据推送到数据库中没问题,这很好。 The problem is just reading the data from the DB, the application can't find my named queries. 问题只是从数据库读取数据,应用程序找不到我的命名查询。

I already tried different things: 我已经尝试了不同的方法:

  • Recompile and deploy application 重新编译和部署应用程序
  • Move persistence.xml into different folders 将persistence.xml移到其他文件夹中
  • Checked error logs and debugged the whole app, couldn't find the reason for this 检查错误日志并调试了整个应用程序,找不到原因
  • Had a look at the all possible solutions I could find on Google and tried them... 看了我可以在Google上找到的所有可能的解决方案,并对其进行了尝试...

What am I missing here? 我在这里想念什么? Any ideas? 有任何想法吗?

BaseObject.java BaseObject.java

@MappedSuperclass
@Multitenant(MultitenantType.TABLE_PER_TENANT)
@TenantTableDiscriminator(type = TenantTableDiscriminatorType.SCHEMA, contextProperty="tenant.id")
public abstract class BaseObject {

    /**
     * The (globally unique) ID of the object.
     */
    @Id
    @Column(name = "GUID", length = 36)
    private String guid = UUID.randomUUID().toString();

    /**
     * The {@link Date} the object was created at.
     */
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "CREATION_DATE", updatable = false)
    private Date createdAt = null;

    /**
     * The {@link Date} the object was last modified at.
     */
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "MODIFICATION_DATE")
    private Date lastModifiedAt = null;

    /**
     * ID of the user who created the object.
     */
    @Column(name = "CREATED_BY", updatable = false, length = 20)
    private String createdBy = null;

    /**
     * ID of the user who was the last to modify the object.
     */
    @Column(name = "MODIFIED_BY", length = 20)
    private String lastModifiedBy = null;

    // Methods...
}

Plant.java 植物.java

@Entity
@Table(name = "PLANT_POLLUTION_DATA")
@NamedQueries({ @NamedQuery(name = "Plant.getPlants", query = "SELECT c FROM Plant c"),
                @NamedQuery(name = "Plant.getPlantById", query = "SELECT c FROM Plant c WHERE c.id = :id") })

@XmlRootElement(name = "plantlist")
@XmlAccessorType(XmlAccessType.FIELD)
public class Plant extends BaseObject implements Serializable {

    /**
     * The <code>serialVersionUID</code> of the {@link Plant} class.
     */
    private static final long serialVersionUID = 1L;

    @Column(name = "ID", length = 36, nullable = true)
    String id = null;

    @Column(name = "O3", length = 10, nullable = true)
    String o3 = null;

    @Column(name = "DATE_FIELD")
    java.sql.Date dateField = null;

    @Column(name = "location", length = 36, nullable = true)
    String location = null;

    // Methods...
}

NamedQuery call NamedQuery调用

String tenantId = getTenantId();
Map<String, String> props = new HashMap<String, String>();
props.put("tenant.id", tenantId);
EntityManager em = this.getEntityManagerFactory().createEntityManager(props);
Query query = em.createNamedQuery("Plant.getPlantById");
query.setParameter("id", id);
retVal = query.getResultList();

persistence.xml (located at "file.war/WEB-INF/classes/META-INF/persistence.xml") persistence.xml (位于“ file.war / WEB-INF / classes / META-INF / persistence.xml”中)

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="pollutionmonitoring" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.company.cloud.samples.pollutionmonitoring.model.BaseObject</class>
        <class>com.company.cloud.samples.pollutionmonitoring.model.Plant</class>
        <properties>
            <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
        </properties>
    </persistence-unit>
</persistence>

I could just fix this problem myself by adding the following 2 lines of code: 我可以自己添加以下两行代码来解决此问题:

...
EntityManager em = this.getEntityManagerFactory().createEntityManager(props);

em.getTransaction().begin();
em.getTransaction().commit();

Query query = em.createNamedQuery("Plant.getPlantById");
...

I don't know what this change exactly does but it works for me :) Maybe someone knows why this solution does work? 我不知道此更改的确切作用,但它对我有用:)也许有人知道为什么此解决方案有效?

PS: I just copied it from another class of mine where I had to add data to the DB and this was the only difference between the both classes. PS:我只是从另一个我的类复制了它,我不得不向数据库添加数据,这是两个类之间的唯一区别。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM