2012-05-25 11 views
6

Hibernate/jpa with scala kullanmaya çalışıyorum. İlginç bir konuya koşmak.

Bu, benim varlık tanımım.

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

Ben şu durum alıyorum hazırda sorgu çalıştırmak

:

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

Açıkçası varsayılan olarak JPA $ 0 init scala autogenerated alan bitmap $ için eşleme oluşturur. Scala'nın onu neden oluşturduğunu bilmiyorum. Fakat jpa'ya bunu görmezden gelmek için söyleyecek bir çözüm var mı? Ya da bir şekilde hazırda bekletme eşlemesinden kaldırır mısınız? Yoksa belki bir şey ..

+0

Kesinlikle aynı sorun yaşıyorum. Ama görüşen sadece iki kişi var gibi görünüyor. –

cevap

0

O otomatik olarak oluşturulan alan nereden geldiğini bilmiyorum, ama daha az alanlara sahip üzere sınıfını düzene deneyebilirsiniz:

@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

temiz görünüyor. Teşekkür ederim. – serg

0

ilginç birkaç şey hakkında Bulundu bu konu.

@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 = _ 

}

Bu sınıf sırayla böyle tanımlanır User adında bir java sınıfı için derlendi:

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

    .... 

benim uygulamada bu Model sınıf var

bitmap$init$0 aslında bir sınıf geliştirmesinden geliyor ve sorumlununolduğunu düşündüm Şu anda kullandığımkütüphanesi. Fakat yazınızı okuduktan sonra, JPA'nın bu nesne üzerinde bir çeşit bytecode geliştirmesi yapıp yapmadığını araştırmaya gittim. Bunu kontrol etmek için bir kopya projesi oluşturdum, ancak Java'da. User sınıf için oluşturulan kod aşağıdaki gibi, hiçbir bitmap$init$0 alanı var olur: sorun

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

Bütün bu tarz bu post götürdü ve ben kesinlikle katılıyorum. JPA'nın Scala Ebean/Hibernate'e entegre edilmesi gerçek bir acıdır. Bu bitmap$ini$0 alanının, Ebean tarafından sınıf bayt koduna veya başka bir şeye enjekte edilmesi durumunda hala anlamadım.

Size, Scala, described here olana benzer bir şey daha sonra java için ilk kod derlenerek oluşturulmuş Java baytkoduna bir şerh (@Transitent) ilişkilendirerek, bu tür davranışları aşmaya çalışacağız gibi görünüyor. Ama gerçekten bunun gerçekten değerli olduğunu sanmıyorum!

İlgili konular