2012-05-25 27 views
6

Cố gắng sử dụng hibernate/jpa với scala. Chạy vào vấn đề thú vị.

Đây là định nghĩa tổ chức của tôi.

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

Khi tôi chạy truy vấn Hibernate Tôi nhận được ngoại lệ sau đây:

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

Rõ ràng JPA theo mặc định tạo ra bản đồ cho scala lĩnh vực autogenerated bitmap $ init $ 0. Tôi không biết điều gì gây ra scala để tạo ra nó. Nhưng bất kể là có bất kỳ giải pháp để nói với jpa bỏ qua nó? Hoặc bằng cách nào đó loại bỏ nó khỏi lập bản đồ ngủ đông? Hoặc có lẽ cái gì khác ..

+0

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ó. –

Trả lời

0

Tôi không biết nơi mà lĩnh vực autogenerated đến từ, nhưng bạn có thể thử để sắp xếp lớp học của bạn để có các trường ít:

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

trông sạch hơn. Cảm ơn bạn. – serg

0

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!

Các vấn đề liên quan