Tìm thấy một vài điều thú vị về vấn đề này.
Tôi có lớp này Model
trong ứng dụng của tôi:
@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 = _
}
Lớp này được biên soạn để một lớp java tên User
, mà lần lượt được định nghĩa như thế này:
@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);
}
....
Số bitmap$init$0
thực sự xuất phát từ việc tăng cường lớp học và tôi nghĩ rằng người chịu trách nhiệm làThư việnmà tôi hiện đang sử dụng. Nhưng sau khi đọc bài viết của bạn tôi đã đi để điều tra nếu JPA chính nó đã làm một số loại tăng cường bytecode trên đối tượng này. Để kiểm tra điều này, tôi đã tạo một dự án sao chép, nhưng trong Java. Các mã được tạo cho lớp User
xảy ra không có lĩnh vực bitmap$init$0
, như sau:
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;
}
}
Tất cả các loại rắc rối dẫn tôi đến post này và tôi chắc chắn hầu hết đồng ý. Dường như việc tích hợp JPA với Scala Ebean/Hibernate là một nỗi đau thực sự. Tôi vẫn không hiểu nếu lĩnh vực này bitmap$ini$0
trong tiêm bytecode lớp bởi Ebean hoặc cái gì khác. Có vẻ như bạn có thể cố gắng bỏ qua loại hành vi này bằng cách liên kết chú thích (@Transitent
) với mã Java bytecode được tạo, bằng cách biên dịch mã đầu tiên cho java rồi đến Scala, một cái gì đó tương tự như described here. Nhưng tôi thực sự không nghĩ rằng đó là thực sự xứng đáng!
Tôi hoàn toàn gặp sự cố tương tự. Nhưng có vẻ như chỉ có hai người gặp nó. –