【问题标题】:scala hibernate/jpa - ignore autogenerated bitmap$init$0 mappingscala hibernate/jpa - 忽略自动生成的位图 $init$0 映射
【发布时间】:2012-05-25 20:27:53
【问题描述】:

尝试在 scala 中使用 hibernate/jpa。遇到有趣的问题。

这是我的实体定义。

@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
}

当我运行休眠查询时,出现以下异常:

[SQLGrammarException: ERROR: column this_.bitmap$init$0 does not exist Position: 29]

显然 jpa 默认为 scala 自动生成的字段 bitmap$init$0 创建映射。我不知道是什么导致 scala 生成它。但不管有没有办法告诉 jpa 忽略它?或者以某种方式将其从休眠映射中删除?或者可能是别的什么..

【问题讨论】:

  • 我也有同样的麻烦。但看起来只有两个人遇到它。

标签: hibernate scala jpa


【解决方案1】:

我不知道自动生成的字段来自哪里,但您可以尝试简化您的课程以减少字段:

@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
}

【讨论】:

    【解决方案2】:

    发现了一些关于这个问题的有趣的事情。

    我的应用程序中有这个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 = _ 
    

    }

    这个类被编译成一个名为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;
      }
    }
    

    所有这些麻烦都让我找到了post,我当然同意。似乎将 JPA 集成到 Scala Ebean/Hibernate 是一种真正的痛苦。我仍然不明白这个 bitmap$ini$0 字段是否是由 Ebean 或其他东西注入到类字节码中的。

    似乎您可以尝试通过将注释 (@Transitent) 与生成的 Java 字节码相关联来绕过这种行为,方法是先为 java 编译代码,然后再为 Scala 编译代码,类似于described here。但我真的觉得这不值得!

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 2020-01-11
      • 2015-07-05
      • 2021-11-22
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多