Почему компилятор не распознает атрибуты метамодели? - PullRequest
6 голосов
/ 11 августа 2010

Поддерживаются ли критерии api eclipselink jpa2 для проектов java se 6? Если нет, то это моя проблема. Нужно ли указывать что-то особенное для критериев api в файле persistence.xml?

Это мой критерий запроса:

 final EntityType<Meaning> Meaning_ = em.getMetamodel().entity(Meaning.class);
    final CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Integer> cq = cb.createQuery(Integer.class);
    final Root<Meaning> meng = cq.from(Meaning.class);
    cq.where(meng.get(Meaning_.lastPublishedDate)); //this attributes are not recognized/found
    cq.select(meng.get(Meaning_.objId));            // "                "                   
    TypedQuery<Integer> q = em.createQuery(cq); 
    return q.getResultList();

А вот мой смысл сущности:

@Entity
public class Meaning implements Serializable{
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int objId;

public int getObjId() {
    return objId;
}

@Temporal(javax.persistence.TemporalType.DATE)
private Date lastPublishedDate = null;//never

public Date getLastPublishedDate(){
        return lastPublishedDate;
    }
}

Ответы [ 4 ]

3 голосов
/ 12 августа 2010

О вашем коде

Я не проверял правильность самого запроса критерия, но, как упоминал Крис, вы смешиваете статические классы метамодели с EntityType, который не раскрывает то, что вынаходясь в поиске.Предполагая, что ваши классы метамодели сгенерированы, удалите первую строку и импортируйте сгенерированные Meaning_:

// final EntityType<Meaning> Meaning_ = em.getMetamodel().entity(Meaning.class); 
final CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Integer> cq = cb.createQuery(Integer.class);
final Root<Meaning> meng = cq.from(Meaning.class);
cq.where(meng.get(Meaning_.lastPublishedDate)); // add the appropriate import 
cq.select(meng.get(Meaning_.objId));            
TypedQuery<Integer> q = em.createQuery(cq); 
return q.getResultList();

О генерации статических (канонических) классов метамодели

Вот установка MavenЯ использую для генерации канонических классов метамодели с EclipseLink:

<project>
  ...
  <repositories>
    <!-- Repository for EclipseLink artifacts -->
    <repository>
      <id>EclipseLink Repo</id>
      <url>http://www.eclipse.org/downloads/download.php?r=1&amp;nf=1&amp;file=/rt/eclipselink/maven.repo/</url>
    </repository>    
    ...
  </repositories>
  ...
  <pluginRepositories>
    <!-- For the annotation processor plugin -->
    <pluginRepository>
      <id>maven-annotation-plugin</id>
      <url>http://maven-annotation-plugin.googlecode.com/svn/trunk/mavenrepo</url>
    </pluginRepository>
  </pluginRepositories>
  ...
  <dependencies>
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>eclipselink</artifactId>
      <version>2.1.0</version>
    </dependency>
    <!-- optional - only needed if you are using JPA outside of a Java EE container-->
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>javax.persistence</artifactId>
      <version>2.0.2</version>
    </dependency>
  <dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <version>1.3.1</version>
        <executions>
          <execution>
            <id>process</id>
            <goals>
              <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
              <!-- Without this, the annotation processor complains about persistence.xml not being present and fail -->
              <compilerArguments>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</compilerArguments>
              <!-- For an unknown reason, the annotation processor is not discovered, have to list it explicitly -->
              <processors>
                <processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor</processor>
              </processors>
              <!-- source output directory -->
              <outputDirectory>${project.build.directory}/generated-sources/meta-model</outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <inherited>true</inherited>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <compilerArgument>-proc:none</compilerArgument>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
</project>

Некоторые комментарии:

  • EclipseLink обработчик аннотаций предоставляется основным артефактом, никакой дополнительной зависимости отдобавлять.
  • По неизвестной причине процессор аннотаций не обнаружен, я должен перечислить его явно как <processor>.
  • Без -Aeclipselink.persistencexml процессор аннотаций жалуется на persistence.xml отсутствует и не работает.
  • Я предпочитаю генерировать исходный код в target (я хочу clean для его очистки).

В этой конфигурации статическийклассы метамодели генерируются и компилируются соответствующим образом.

2 голосов
/ 11 августа 2010

Похоже, вы смешиваете классы статической метамодели с классом EntityTypeEntityType не будет никаких атрибутов вашей метамодели - вам нужно будет получить к ним доступ, используя методы getSingularAttribute и getCollection, то есть:

meng.get(Meaning_.getSingularAttribute("someString", String.class))

Или вы можете использовать статическую метамодель напрямую, но вам придется создать классы _ вручную или использовать генератор, как описано в http://wiki.eclipse.org/UserGuide/JPA/Using_the_Canonical_Model_Generator_%28ELUG%29

1 голос
/ 11 августа 2010

Какую IDE вы используете?

Criteria API в JPA 2.0 поддерживает как строковые ссылки на атрибуты, так и проверенные константы типа, которые должны быть скомпилированы с помощью какого-либо инструмента.

Вы можете использоватьСтроковый API без каких-либо специальных действий, например

cq.where(meng.get("lastPublishedDate"));
cq.select(meng.get("objId"));

Чтобы использовать константы с проверкой типа, вам нужно как-то сгенерировать эти статические классы.Если вы используете Eclipse IDE, поддержка Eclipse JPA 2.0 (Dali) может автоматически генерировать эти классы для вас.

EclipseLink также предоставляет генератор, который можно использовать с ant, javac или интегрировать с IDE.

См. http://wiki.eclipse.org/UserGuide/JPA/Using_the_Canonical_Model_Generator_%28ELUG%29

0 голосов
/ 27 апреля 2011

Если вы попробуете это в Eclipse IDE и в вашем файле pom.xml укажите:

<outputDirectory> src/main/generated-java </outputDirectory>

для классов metalmodel, один из способов решить эту проблему - выбрать New / Source Folder и вот поставь тот же рут src / main / generate-java, автоматически создай папку с созданными классами.

Попробуй распознать этот класс, для меня это нормально!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...