发现了一些关于这个问题的有趣的事情。
我的应用程序中有这个Model
类:
@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 = _
}
此类被编译为名为 的 java 类User
,其定义如下:
@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);
}
....
bitmap$init$0
实际上来自类增强,我认为负责的是我目前正在使用的库Ebean
。但是在阅读了您的帖子后,我去调查 JPA 本身是否正在对该对象进行某种字节码增强。为了检查这一点,我创建了一个复制项目,但使用的是 Java。生成的User
类代码恰好没有bitmap$init$0
字段,如下:
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;
}
}
所有这些麻烦都让我写了这篇文章,我当然同意。似乎将 JPA 集成到 Scala Ebean/Hibernate 是一种真正的痛苦。我仍然不明白这个bitmap$ini$0
字段是否由 Ebean 或其他东西注入到类字节码中。
似乎您可以尝试通过将注释 ( @Transitent
) 与生成的 Java 字节码相关联来绕过这种行为,方法是先为 java 编译代码,然后再为 Scala 编译代码,类似于此处描述的内容。但我真的不认为这是真的值得!