Modeling weak entities with a composite key and @ManyToOne

68 views
Skip to first unread message

Florian Kroiß

unread,
Sep 19, 2019, 3:52:29 PM9/19/19
to Ebean ORM
Hi,

I'm trying to model a simple scenario with a strong entity (House) and weak entity (Room)
The primary key of the house is an id, the primary key of the room is a composite key consisting of the house id and room no.

I tried to model this with the following 3 classes:
@Entity
public class House extends Model implements Serializable {

  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue
  private String id;

  @PrivateOwned
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "id.house")
  private List<Room> rooms;

  //Getter + Setter

}

@Entity
public class Room extends Model implements Serializable {

  private static final long serialVersionUID = 1L;

  @EmbeddedId
  private RoomPK id;

  //Getter + Setter
  
}

@Embeddable
public class RoomPK implements Serializable {
  
  private static final long serialVersionUID = 1L;

  @ManyToOne
  @JoinColumn(name = "id")
  private House house;

  @Size(max = 32)
  @Column(insertable = false, nullable = false)
  private String roomNo;

  //Getter + Setter + hashCode + equals
  
}

I created a small test within our ebean fork here (https://github.com/FOCONIS/ebean/commit/3b477ed957952c753afd56785884bd51e954f6e3)
Is this the correct way to implement this? Because ebean currently throws the following error:
java.lang.ExceptionInInitializerError: null
at io.ebean.BaseTestCase.<clinit>(BaseTestCase.java:72)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at io.ebean.ConditionalTestRunner.runChild(ConditionalTestRunner.java:33)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: Error reading annotations for org.tests.compositekeys.db.RoomPK
at io.ebean.Ebean$ServerManager.<init>(Ebean.java:89)
at io.ebean.Ebean$ServerManager.<init>(Ebean.java:67)
at io.ebean.Ebean.<clinit>(Ebean.java:43)
... 24 common frames omitted
Caused by: java.lang.RuntimeException: Error reading annotations for org.tests.compositekeys.db.RoomPK
at io.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:60)
at io.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1422)
at io.ebeaninternal.server.deploy.BeanDescriptorManager.registerEmbeddedBean(BeanDescriptorManager.java:757)
at io.ebeaninternal.server.deploy.BeanDescriptorManager.readEntityDeploymentInitial(BeanDescriptorManager.java:747)
at io.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:375)
at io.ebeaninternal.server.core.InternalConfiguration.<init>(InternalConfiguration.java:202)
at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:138)
at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:70)
at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:1)
at io.ebean.EbeanServerFactory.create(EbeanServerFactory.java:58)
at io.ebean.Ebean$ServerManager.getWithCreate(Ebean.java:126)
at io.ebean.Ebean$ServerManager.<init>(Ebean.java:75)
... 26 common frames omitted
Caused by: io.ebean.config.BeanNotRegisteredException: Error with association to [class org.tests.compositekeys.db.House] from [org.tests.compositekeys.db.RoomPK.house]. Is class org.tests.compositekeys.db.House registered? Does it have the @Entity annotation? See https://ebean.io/docs/trouble-shooting#not-registered
at io.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.beanTable(AnnotationAssocOnes.java:202)
at io.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.readManyToOne(AnnotationAssocOnes.java:213)
at io.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.readAssocOne(AnnotationAssocOnes.java:66)
at io.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.parse(AnnotationAssocOnes.java:57)
at io.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:49)
... 37 common frames omitted

Has anyone build a similar scenario or are there better ways to implement this?

Thanks and best regards
Florian

Rob Bygrave

unread,
Sep 20, 2019, 1:59:45 AM9/20/19
to ebean@googlegroups
Well the cause error says "BeanNotRegisteredException: Error with association to [class org.tests.compositekeys.db.House] from [org.tests.compositekeys.db.RoomPK.house]. Is class org.tests.compositekeys.db.House registered?"

So that is the first question you need to answer.

--

---
You received this message because you are subscribed to the Google Groups "Ebean ORM" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ebean+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ebean/4927dd62-4500-4ba5-8d6b-d3e7d894c070%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages