簡體   English   中英

使用Ebean的Play Framework 2.3.3中的異常映射@ManyToOne關系

[英]Exception mapping @ManyToOne relationship in Play Framework 2.3.3 using Ebean

由於映射到Play Framework 2.3.3中的模型,我無法映射關系。

我有兩個模型GaDataModelBusinessAccounts ,它們之間的關系為ManyToOne ,在模型GaDataModel中,我聲明的是基本上是@Embedabble PK的類GaDataModelPK中的關系。

以下類是我當前的實現。

GaDataModelPK

@Embeddable
public class GaDataModelPK implements Serializable {

    @ManyToOne
    @JoinColumn(nullable = false)
    public BusinessAccount businessAccount;

    @Column(nullable = false)
    public String date;

    @Override
    public boolean equals(Object o) {
        ...
    }

    @Override
    public int hashCode() {
        ...
    }
}

GaDataModel

@Entity
@Table(name = "ga_data_model")
public class GaDataModel extends Model {

    @EmbeddedId
    public GaDataModelPK gaDataModelPK;
        ...
    }
}

BusinessAccounts

@Entity
@Table(name = "business_account")
public class BusinessAccount extends Model {

    @EmbeddedId
    public BusinessAccountPK businessAccountPK;

    public String portal;

    public String region;
    public String category;

    public String hqCountry;
    public String portalCountry;

    @OneToMany(mappedBy = "business_account", cascade = {CascadeType.REMOVE})
    public List<GaDataModel> gaDataModels;

    ...
}

但是當我嘗試運行該應用程序時,出現以下異常

PLAY WEBBROWSER中的堆棧跟蹤

java.lang.RuntimeException: Error reading annotations for repository.models.GaDataModelPK
     com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:54)
     com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1028)
     com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.createEmbedded(BeanDescriptorManager.java:455)
     com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readEmbeddedDeployment(BeanDescriptorManager.java:478)
     com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:232)
     com.avaje.ebeaninternal.server.core.InternalConfiguration.<init>(InternalConfiguration.java:114)
     com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:204)
     com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:65)
     com.avaje.ebean.EbeanServerFactory.create(EbeanServerFactory.java:58)
     play.db.ebean.EbeanPlugin.onStart(EbeanPlugin.java:89)
     play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91)
     play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91)
     scala.collection.immutable.List.foreach(List.scala:318)
     play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:91)
     play.api.Play$$anonfun$start$1.apply(Play.scala:91)
     play.api.Play$$anonfun$start$1.apply(Play.scala:91)
     play.utils.Threads$.withContextClassLoader(Threads.scala:21)
     play.api.Play$.start(Play.scala:90)
     play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:142)
     play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:115)
     scala.Option.map(Option.scala:145)
     play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:115)
     play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:113)
     scala.util.Success.flatMap(Try.scala:200)
     play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:113)
     play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:105)
     scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
     scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
     scala.concurrent.forkjoin.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1361)
     scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
     scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
     scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)

PLAY CONSOLE中的堆棧跟蹤:

    java.lang.NullPointerException: null
    at play.libs.ws.ning.NingWSPlugin.onStop(NingWSPlugin.java:31) ~[play-java-ws_2.10-2.3.1.jar:2.3.1]
    at play.api.Play$$anonfun$stop$1$$anonfun$apply$1$$anonfun$apply$mcV$sp$2.apply(Play.scala:108) [play_2.10-2.3.1.jar:2.3.1]
    at play.api.Play$$anonfun$stop$1$$anonfun$apply$1$$anonfun$apply$mcV$sp$2.apply(Play.scala:107) [play_2.10-2.3.1.jar:2.3.1]
    at scala.collection.immutable.List.foreach(List.scala:318) [scala-library.jar:na]
    at play.api.Play$$anonfun$stop$1$$anonfun$apply$1.apply$mcV$sp(Play.scala:107) [play_2.10-2.3.1.jar:2.3.1]
[info] play - database [default] connected at jdbc:mysql://localhost/analytics
[error] c.a.e.s.d.BeanDescriptorManager - Error in deployment
java.lang.RuntimeException: Error reading annotations for repository.models.GaDataModelPK
    at com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:54) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1028) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.createEmbedded(BeanDescriptorManager.java:455) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readEmbeddedDeployment(BeanDescriptorManager.java:478) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:232) ~[avaje-ebeanorm-3.3.4.jar:na]
Caused by: java.lang.RuntimeException: Error with association to [class repository.models.BusinessAccount] from [repository.models.GaDataModelPK.businessAccount]. Is class repository.models.BusinessAccount registered?
    at com.avaje.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.readManyToOne(AnnotationAssocOnes.java:165) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.readAssocOne(AnnotationAssocOnes.java:63) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.parse(AnnotationAssocOnes.java:54) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:45) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1028) ~[avaje-ebeanorm-3.3.4.jar:na]
[error] application - 

! @6j99d9gfb - Internal server error, for (GET) [/] ->

play.api.UnexpectedException: Unexpected exception[RuntimeException: Error reading annotations for repository.models.GaDataModelPK]
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:151) ~[play_2.10-2.3.1.jar:2.3.1]
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:115) ~[play_2.10-2.3.1.jar:2.3.1]
    at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:115) ~[play_2.10-2.3.1.jar:2.3.1]
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:113) ~[play_2.10-2.3.1.jar:2.3.1]
Caused by: java.lang.RuntimeException: Error reading annotations for repository.models.GaDataModelPK
    at com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:54) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1028) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.createEmbedded(BeanDescriptorManager.java:455) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readEmbeddedDeployment(BeanDescriptorManager.java:478) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:232) ~[avaje-ebeanorm-3.3.4.jar:na]
Caused by: java.lang.RuntimeException: Error with association to [class repository.models.BusinessAccount] from [repository.models.GaDataModelPK.businessAccount]. Is class repository.models.BusinessAccount registered?
    at com.avaje.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.readManyToOne(AnnotationAssocOnes.java:165) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.readAssocOne(AnnotationAssocOnes.java:63) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.parse(AnnotationAssocOnes.java:54) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:45) ~[avaje-ebeanorm-3.3.4.jar:na]
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1028) ~[avaje-ebeanorm-3.3.4.jar:na]

我有這樣的事情:

@OneToMany(mappedBy="contact", targetEntity= gaDataModels.class)

@ManyToOne
@JoinColumn(name="business_account", nullable=false)

那是在Play 2.1.1中實現的,但是我看不出它為什么不起作用的任何原因。

要解決此問題,您必須:

  1. 將@ManyToOne關系從GaDataModelPK移到GaDataModel,然后將屬性'insertable'= false和'updateable'= false添加到@JoinColumn批注。
  2. 在GaDataModelPK類中,保留businessAccountId。
  3. GaDataModel中的businessAccount的替代設置程序。 在此設置方法中,我們應將businessAccount.id寫入復合鍵。

這是代碼:

GaDataModel類:

@Entity
@Table(name = "ga_data_model")
public class GaDataModel extends Model {

    public GaDataModel(String aDate) {
        gaDataModelPK = new GaDataModelPK();
        gaDataModelPK.date = aDate;
    }

    @EmbeddedId
    public GaDataModelPK gaDataModelPK;

    @ManyToOne
    @JoinColumn(name = "business_account_id", insertable = false, updatable = false)
    private BusinessAccount businessAccount;

    public void setBusinessAccount(BusinessAccount aBusinessAccount) {
        businessAccount = aBusinessAccount;
        gaDataModelPK.businessAccountId = aBusinessAccount.id;
    }
} 

GaDataModelPK類:

@Embeddable
public class GaDataModelPK implements Serializable {

    public Long businessAccountId;

    @Column(nullable = false)
    public String date;

    @Override
    public boolean equals(Object o) {
        return businessAccountId;
    }

    @Override
    public int hashCode() {
        return 0;
    }
}

BusinessAccount類:

@Entity
@Table(name = "business_account")
public class BusinessAccount extends Model {

    @Id
    public Long id;

    public String portal;
    public String region;
    public String category;
    public String hqCountry;
    public String portalCountry;

    @OneToMany(mappedBy = "businessAccount")
    public List<GaDataModel> gaDataModels;
}

測試方法:

@Test
public void businessAccountTest () {
    FakeApplication app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
    Helpers.start(app);

    BusinessAccount ba = new BusinessAccount();
    ba.id=1L;

    GaDataModel gd = new GaDataModel("01/01/2014");
    gd.setBusinessAccount(ba);
    ba.gaDataModels.add(gd);

    Ebean.save(ba);
    Ebean.save(gd);

    BusinessAccount fba = Ebean.find(BusinessAccount.class, 1L);
    GaDataModel fgd = fba.gaDataModels.get(0);
    System.out.println("GaDataModel:  date:"+fgd.gaDataModelPK.date);
}

注意:您沒有在帖子中提供BusinessAccountPK類的代碼,因此我將BusinessAccount的ID更改為Long。 但是,您可以使該關系與GaDataModel-GaDataModelPK關系相同。 或者,如果您更新問題,我也可以更新我的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM