2013-11-24 227 views
3

我有關於外鍵關係及其JPA副本的問題。作爲外鍵的主鍵映射到另一個表

在下表中。 means_of_transport是一個連續編號的表格。其他表具有較少的條目,其主鍵作爲外鍵映射到means_of_transport的主鍵。可悲的是,我無法改變數據模型。

means_of_transport

CREATE TABLE means_of_transport (
    id INT PRIMARY KEY NOT NULL, 
    max_capacity INT 
); 

ocean_ship

CREATE TABLE ocean_ship (
    means_of_transport_id INT PRIMARY KEY NOT NULL, 
    name VARCHAR(45) NOT NULL, 
    FOREIGN KEY (means_of_transport_id) REFERENCES means_of_transport (id) 
); 
CREATE INDEX fk_ship_means_of_transport1_idx ON ocean_ship (means_of_transport_id); 

有除了ocean_ship多個表使用相同的密鑰結構,但其他領域。

MeansOfTransport.java

@Entity 
@Table(name = "means_of_transport") 
public class MeansOfTransport extends Model { 
    @Id 
    public Integer id; 
    public Integer maxCapacity; 
} 

OceanShip.java

@Entity 
@Table(name = "ocean_ship") 
public class OceanShip extends Model { 
    @Id 
    @OneToOne 
    @JoinColumn(table = "means_of_transport", referencedColumnName = "id") 
    public MeansOfTransport meansOfTransport; 

    public String name; 
} 

現在,每當我嘗試在其他JPA類作爲野外使用OceanShip的時候,我得到這個錯誤:Error reading annotations for models.Classname

我是否缺少一些註釋?

編輯

用法示例:

@ManyToOne 
@Column(name = "ocean_ship") 
public OceanShip oceanShip; 

完整堆棧跟蹤:

play.api.UnexpectedException: Unexpected exception[RuntimeException: Error reading annotations for models.ContainerOrder] 
     at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:150) ~[play_2.10.jar:2.1.5] 
     at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:114) ~[play_2.10.jar:2.1.5] 
     at scala.Option.map(Option.scala:145) ~[scala-library.jar:na] 
     at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:114) ~[play_2.10.jar:2.1.5] 
     at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.1.5] 
     at scala.util.Either$RightProjection.flatMap(Either.scala:523) ~[scala-library.jar:na] 
Caused by: java.lang.RuntimeException: Error reading annotations for models.ContainerOrder 
     at com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:54) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1034) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readEntityDeploymentAssociations(BeanDescriptorManager.java:565) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:252) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.core.InternalConfiguration.<init>(InternalConfiguration.java:124) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:210) ~[avaje-ebeanorm-server.jar:na] 
Caused by: java.lang.NullPointerException: null 
     at com.avaje.ebeaninternal.server.deploy.BeanTable.createJoinColumn(BeanTable.java:94) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.readAssocOne(AnnotationAssocOnes.java:145) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.deploy.parse.AnnotationAssocOnes.parse(AnnotationAssocOnes.java:54) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:45) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1034) ~[avaje-ebeanorm-server.jar:na] 
     at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readEntityDeploymentAssociations(BeanDescriptorManager.java:565) ~[avaje-ebeanorm-server.jar:na] 
+0

您可以發佈完整的錯誤註釋? –

+0

@SotiriosDelimanolis我添加了完整的堆棧跟蹤 – nkr

回答

1

錯誤消息出現了,因爲一些註釋是錯誤的。

我將OceanShip的主鍵從MeansOfTransport更改爲Integer,現在要小心我輸入的內容。這是我必須付出的代價。

此外,我改變了,我用OceanShip從這個

@ManyToOne 
@Column(name = "ocean_ship") 
public OceanShip oceanShip; 

這個

@ManyToOne 
@JoinColumn(name = "ocean_ship", referencedColumnName = "means_of_transport_id") 
public OceanShip oceanCarrierShip; 
3

我覺得你的數據庫模型在概念上不正確的。

它應該是下面這樣的東西。

ocean_ship_id是ocean_ship表的PK。 而ocean_ship 中的means_of_transport_id僅僅是FK到「base」表的means_of_transport。

所以我會說你得到你的數據庫模型的權利, 然後擔心JPA映射。

CREATE TABLE ocean_ship (
    ocean_ship_id INT PRIMARY KEY NOT NULL, 
    means_of_transport_id INT NOT NULL, 
    name VARCHAR(45) NOT NULL, 
    FOREIGN KEY (means_of_transport_id) REFERENCES means_of_transport (id) 
); 
+0

你是對的,但遺憾的是我無法以任何方式改變數據模型。我在這個問題上加了這個。我必須找到一種方法來用JPA進行建模。 – nkr

相關問題