2012-05-25 11 views
6

Próbujesz użyć hibernacji/jpa ze skalą. Uruchomiono interesujący problem.

To jest definicja mojej jednostki.

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

Kiedy uruchomić kwerendę hibernacji ja otrzymuję następujący wyjątek:

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

Oczywiście JPA domyślnie tworzy odwzorowanie dla scala bitmapy pola wygenerowany automatycznie $ Init $ 0. Nie wiem, co powoduje, że scala go generuje. Ale czy istnieje jakieś rozwiązanie, aby powiedzieć jpa, aby to zignorował? Lub w jakiś sposób usunąć go z mapowania hibernacji? A może coś innego ..

+0

Mam absolutnie ten sam problem. Wygląda jednak na to, że spotykają się tylko dwie osoby. –

Odpowiedz

0

nie wiem, gdzie to pole wygenerowany automatycznie pochodzi, ale można spróbować usprawnić swoją klasę mieć mniej pól:

@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

wygląda na czystszy. Dziękuję Ci. – serg

0

znalazłem parę ciekawych rzeczy o ten przypadek.

mam ten Model klasę w mojej aplikacji:

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

}

Ta klasa jest kompilowany do klasy Java o nazwie User, który z kolei jest zdefiniowany następująco:

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

    .... 

The bitmap$init$0 faktycznie pochodzi z klasy poprawy i myślałem, że odpowiedzialna byłaBiblioteka, z której aktualnie korzystam. Ale po przeczytaniu twojego postu poszedłem zbadać czy JPA robi jakieś ulepszenie kodu bajtowego na tym obiekcie. Aby to sprawdzić, utworzyłem projekt kopiowania, ale w Javie. Kod generowany dla klasy User zdarza się nie mieć bitmap$init$0 pole, jak następuje:

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

Wszystkie tego rodzaju kłopoty doprowadziły mnie do tego post a ja na pewno zgadzają. Wygląda na to, że integracja JPA z Scala Ebean/Hibernate jest prawdziwym bólem. Nadal nie rozumiem, czy to pole bitmap$ini$0 jest wstrzyknięte do klasy przez kod Ebean lub coś innego.

Wygląda na to, że można spróbować ominąć tego rodzaju zachowanie, przypisując adnotację (@Transitent) do wygenerowanego kodu bajtowego Java, kompilując najpierw kod dla java, a następnie Scala, coś podobnego do tego, co jest described here. Ale naprawdę nie sądzę, że to naprawdę warte!

Powiązane problemy