Перевести Java класс со статическими атрибутами и аннотациями в эквивалент Scala - PullRequest
3 голосов
/ 13 июня 2010

В настоящее время я пытаюсь "перевести" следующий класс Java в эквивалентный класс Scala. Это часть JavaEE6-приложения, и мне нужно использовать метамодель JPA2.

import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@StaticMetamodel(Person.class)
public class Person_ {
  public static volatile SingularAttribute<Person, String> name;
}

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

> javap Person_.class :
public class model.Person_ extends java.lang.Object{
  public static volatile javax.persistence.metamodel.SingularAttribute name;
  public model.Person_();
} 

Так что теперь мне нужен эквивалентный файл Scala, имеющий такую ​​же структуру, поскольку JPA зависит от него, потому что он разрешает атрибуты отражением, чтобы сделать их доступными во время выполнения. Поэтому главная проблема, я думаю, заключается в том, что атрибут является статическим, но аннотация должна быть на (Java) объекте (я полагаю) Моя первая наивная попытка создать эквивалент Scala заключается в следующем:

@StaticMetamodel(classOf[Person])
class Person_

object Person_ {
  @volatile var name:SingularAttribute[Person, String] = _;
}

Но полученный файл классов далек от Java, поэтому он не работает. При попытке доступа к атрибутам во время выполнения, например, "Person_.firstname", он разрешается до нуля, я думаю, что JPA не может правильно применить магию отражения к скомпилированному файлу классов (вариант Java разрешает экземпляр org.hibernate.ejb.metamodel.SingularAttributeImpl во время выполнения).

> javap Person_.class :
public class model.Person_ extends java.lang.Object implements scala.ScalaObject{
  public static final void name_$eq(javax.persistence.metamodel.SingularAttribute);
  public static final javax.persistence.metamodel.SingularAttribute name();
  public model.Person_();
}

> javap Person_$.class :
public final class model.Person__$ extends java.lang.Object implements scala.ScalaObject
  public static final model.Person__$ MODULE$;
  public static {};
  public javax.persistence.metamodel.SingularAttribute name();
  public void name_$eq(javax.persistence.metamodel.SingularAttribute);
}

Так что теперь я хотел бы знать, возможно ли вообще создать Scala-эквивалент Java-класса? Мне кажется, что это абсолютно не так, но, возможно, есть обходной путь или что-то в этом роде (кроме использования Java, но я хочу, чтобы мое приложение было в Scala, где это возможно)

Есть идеи, кто-нибудь? Заранее спасибо!

1 Ответ

1 голос
/ 14 июня 2010

Как видите, сопутствующие объекты Scala скомпилированы в отдельные классы по одноэлементному шаблону (единственный экземпляр удерживается в MODULE $).Это необходимо, так как они могут наследоваться и от других классов.

AFAIK В Scala нет способа получить необходимый статический метод в Person.Я не использую JPA со Scala, поэтому я не могу много говорить об этом.Возможно, некоторые люди из одного из списков рассылки Scala могли бы рассказать вам больше.

Есть более старая статья о JPA и Scala, но я думаю, что она устарела.

...