2013-11-24 229 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

相关问题