JPA:名称查询名称:...未找到

时间:2017-08-30 09:43:57

标签: java jpa schema eclipselink named-query

我正在我的公司开发一个带有JPA的多项目应用程序。因此,我使用TABLE_PER_TENANT功能将租户特定数据分成不同的模式。将数据推入数据库是没有问题的,这很好。问题只是从数据库中读取数据,应用程序无法找到我的命名查询。

我已经尝试了不同的东西:

  • 重新编译和部署应用程序
  • 将persistence.xml移动到不同的文件夹
  • 检查错误日志并调试整个应用程序,找不到此原因
  • 看看我在谷歌上找到的所有可能的解决方案并尝试过它们......

我在这里缺少什么?有什么想法吗?

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

@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调用

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 (位于“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>

1 个答案:

答案 0 :(得分:-1)

我可以通过添加以下两行代码来解决此问题:

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

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

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

我不知道这个改变究竟做了什么,但它对我有用:)也许有人知道为什么这个解决方案有效?

PS:我刚从我的另一个类中复制它,我必须将数据添加到数据库中,这是两个类之间的唯一区别。