znalazłem parę ciekawych rzeczy o ten przypadek.
mam ten Model
klasę w mojej aplikacji:
@Entity
@Table(name="users")
class User extends Model{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="users_id_seq")
@Column(name="id", updatable=false, nullable=false)
val id:Long = 0L
@BeanProperty var name:String = _
@BeanProperty var email:String = _
}
Ta klasa jest kompilowany do klasy Java o nazwie User
, który z kolei jest zdefiniowany następująco:
@Entity
@Table(name="users")
@ScalaSignature(bytes=long array of bytes)
public class User extends Model
implements ScalaObject, EntityBean
{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="users_id_seq")
@Column(name="id", updatable=false, nullable=false)
private final long id;
private String name;
private String email;
private volatile int bitmap$init$0;
private static String _EBEAN_MARKER = "models.User";
...
public long id()
{
if ((_ebean_get_bitmap$init$0() & 0x1) != 0)
{
_ebean_get_id(); return _ebean_get_id();
}
throw new
UninitializedFieldError("Uninitialized field: User.scala: 17".toString());
}
public String name()
{
if ((_ebean_get_bitmap$init$0() & 0x2) != 0)
{
_ebean_get_name(); return _ebean_get_name();
} throw new
UninitializedFieldError("Uninitialized field: User.scala: 19".toString());
}
public void name_$eq(String paramString) {
_ebean_set_name(paramString);
_ebean_set_bitmap$init$0(_ebean_get_bitmap$init$0() | 0x2);
}
....
The bitmap$init$0
faktycznie pochodzi z klasy poprawy i myślałem, że odpowiedzialna byłaBiblioteka, z której aktualnie korzystam. Ale po przeczytaniu twojego postu poszedłem zbadać czy JPA robi jakieś ulepszenie kodu bajtowego na tym obiekcie. Aby to sprawdzić, utworzyłem projekt kopiowania, ale w Javie. Kod generowany dla klasy User
zdarza się nie mieć bitmap$init$0
pole, jak następuje:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="users")
public class User
{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="users_id_seq")
@Column(name="id", updatable=false, nullable=false)
private Long id;
private String name;
private String email;
public void setId(Long id)
{
this.id = id;
}
public Long getId() {
return this.id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
Wszystkie tego rodzaju kłopoty doprowadziły mnie do tego post a ja na pewno zgadzają. Wygląda na to, że integracja JPA z Scala Ebean/Hibernate jest prawdziwym bólem. Nadal nie rozumiem, czy to pole bitmap$ini$0
jest wstrzyknięte do klasy przez kod Ebean lub coś innego.
Wygląda na to, że można spróbować ominąć tego rodzaju zachowanie, przypisując adnotację (@Transitent
) do wygenerowanego kodu bajtowego Java, kompilując najpierw kod dla java, a następnie Scala, coś podobnego do tego, co jest described here. Ale naprawdę nie sądzę, że to naprawdę warte!
Mam absolutnie ten sam problem. Wygląda jednak na to, że spotykają się tylko dwie osoby. –