scala hibernate/jpa-忽略自动生成的位图$init$0映射
正在尝试将hibernate/jpa与scala一起使用。遇到了有趣的问题 这是我的实体定义scala hibernate/jpa-忽略自动生成的位图$init$0映射,hibernate,scala,jpa,Hibernate,Scala,Jpa,正在尝试将hibernate/jpa与scala一起使用。遇到了有趣的问题 这是我的实体定义 @Entity class Product(n: String, d: Double) extends EntityBase { def this() = this("", 0) def this(n: String) = this(n, 0) var name: String = n var price: Double = d @ManyToOne @JoinColumn
@Entity
class Product(n: String, d: Double) extends EntityBase {
def this() = this("", 0)
def this(n: String) = this(n, 0)
var name: String = n
var price: Double = d
@ManyToOne
@JoinColumn(name="orderId")
var order: Order = _
override def toString = "Product: " + id + " " + name
}
在运行hibernate查询时,出现以下异常:
[SQLGrammarException: ERROR: column this_.bitmap$init$0 does not exist Position: 29]
显然,jpa默认为scala自动生成的字段位图$init$0创建映射。我不知道是什么导致scala生成它。但不管怎样,有没有办法让jpa忽略它?或者从hibernate映射中删除它?或者其他的东西。我不知道自动生成的字段是从哪里来的,但是您可以尝试简化您的类以减少字段:
@Entity
class Product(var name: String = "", var price: Double = 0) extends EntityBase {
@ManyToOne
@JoinColumn(name="orderId")
var order: Order = _
override def toString = "Product: " + id + " " + name
}
在这个问题上发现了一些有趣的事情 我的应用程序中有这个
模型
类:
@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 = _
}
该类被编译为名为User
的java类,其定义如下:
@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是一种真正的痛苦。我仍然不明白Ebean或其他什么东西是否将这个位图$ini$0
字段注入到类字节码中
似乎可以通过将注释(
@transient
)与生成的Java字节码相关联,先为Java编译代码,然后再编译为Scala,来绕过这种行为,类似于。但我真的不认为这真的值得 我也有同样的问题。但看起来只有两个人遇到它。