我在過去三個月裏一直在研究在服務器上使用dev和postgres中的h2的新玩法框架2.4 application。我們使用ebean作爲ORM和Java 8作爲開發語言,並且我一般對這種體驗感到滿意。爲什麼我會得到「[類別...]不是註冊實體?」
該應用程序的一個要求是將一些數據存儲在外部mysql數據庫中。
所以我加入了數據庫,我application.conf:
db.quba.driver = com.mysql.jdbc.Driver
db.quba.url = "jdbc:mysql://localhost:3306/quba"
db.quba.username = "..."
db.quba.password = "..."
設置爲dB至關遷移:
play.evolutions.db.quba.enabled = false
添加了ebean配置:
ebean.quba= "quba.models.*"
創建模型:
package quba.models;
import javax.persistence.*;
import com.avaje.ebean.Expr;
import com.avaje.ebean.Model;
@Entity
@Table(name = "st_profile")
public class QubaStationProfile extends Model {
public static Model.Finder<Long, QubaStationProfile> find = new Model.Finder<>("quba",QubaStationProfile.class);
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "stationid")
public Long id;
public Integer session;
public String profiles;
public String exception;
public String site;
public static QubaStationProfile findStProfileByStationAndTermin(Long stationid, int termin) {
return QubaStationProfile.find.where()
.conjunction()
.add(Expr.eq("stationid", stationid))
.add(Expr.eq("session", termin))
.findUnique();
}
}
並實施了使用模型的服務。
我的問題是,altough我可以使用該模型使用的查找方法,一旦查詢的數據庫,我儘量節省()的實體,我得到了以下錯誤消息:
javax.persistence.PersistenceException: The type [class quba.models.QubaStation] is not a registered entity? If you don't explicitly list the entity classes to use Ebean will search for them in the classpath.
If the entity is in a Jar check the ebean.search.jars property in ebean.properties file or check ServerConfig.addJar().
at com.avaje.ebeaninternal.server.persist.DefaultPersister.createRequest(DefaultPersister.java:1189) ~[avaje-ebeanorm-4.6.2.jar:na]
我有加入
playEbeanDebugLevel := 9
我build.sbt並驗證在quba.models類。*確實被拾起,並通過儀器將被ebean SBT劑。
ebean-enhance> cls: quba/models/QubaStation msg: already enhanced entity
ebean-enhance> cls: quba/models/QubaStation msg: no enhancement on class
我也驗證了mysql用戶可以訪問數據庫並有權限創建和更新該數據庫中的記錄。
這是一個失敗的測試案例
package models;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import play.test.FakeApplication;
import play.test.Helpers;
import quba.models.QubaStation;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class QubaStationModelTest {
public FakeApplication app;
@Test
public void testCreateStation(){
QubaStation station = new QubaStation();
station.name ="X";
station.latitude = 1;
station.longitude = 2;
station.save();
station = QubaStation.findStationByName("X");
assertNotNull(station);
assertEquals("","X",station.name);
station.delete();
}
@Before
public void before() {
Map<String, String> mysql = new HashMap<>();
mysql.put("db.quba.driver","com.mysql.jdbc.Driver");
mysql.put("db.quba.url","jdbc:mysql://localhost:3306/quba");
mysql.put("db.quba.username","...");
mysql.put("db.quba.password","...");
app = Helpers.fakeApplication(mysql);
Helpers.start(app);
}
@After
public void after() {
Helpers.stop(app);
}
}
測試輸出:
[error] Test models.QubaStationModelTest.testCreateStation failed: javax.persistence.PersistenceException: The type [class quba.models.QubaStation] is not a registered entity? If you don't explicitly list the entity classes to use Ebean will search for them in the classpath. If the entity is in a Jar check the ebean.search.jars property in ebean.properties file or check ServerConfig.addJar()., took 3.608 sec
[error] at com.avaje.ebeaninternal.server.persist.DefaultPersister.createRequest(DefaultPersister.java:1189)
[error] at com.avaje.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:208)
[error] at com.avaje.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:199)
[error] at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1461)
[error] at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1454)
[error] at com.avaje.ebean.Model.save(Model.java:208)
[error] at models.QubaStationModelTest.testCreateStation(QubaStationModelTest.java:26)
上解決此問題的任何幫助將不勝感激。
更新:
我也嘗試了新的列表語法
ebean.quba= ["quba.models.*"]
以及枚舉個別模型類:
ebean.quba= ["quba.models.QubaStationProfile","quba.models.QubaStation"]
,但並沒有區別。
另請注意,我沒有使用「默認」服務器。我用
play.ebean.defaultDatasource=h2
發展,使用
play.ebean.defaultDatasource=postgres
我也注意到這是在服務器配置覆蓋期間,即使變陣是庫巴禁用,但發揮創造的進化腳本。這可能會或可能不會與此問題相關。
UPDATE:
我已經確定,試圖保存在「庫巴」數據庫所屬的對象時播放ebean使用「Postgres的serverConfig中。由於'postgres'的BeanDescriptorManager不包含'quba'數據庫的任何BeanDescriptor,因此它失敗。
我想下一步是檢查哪個Ebean服務器在內部使用 - 「default」或「quba」。 –
我可以在你的配置中看到,但看着Ebean源代碼,它有可能與此鏈接。 - https://github.com/ebean-orm/avaje-ebeanorm/blob/avaje-ebeanorm-4.5.6/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java#L1186 –
它或者是這樣,或者對「額外」服務器(quba)有些混淆,我想。我不認爲這是我的配置問題,只要我可以使用模型bean來查詢數據庫。 –