2013-11-24 5 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; 
} 

Теперь каждый раз, когда я пытаюсь использовать OceanShip в другом классе JPA как поле, я получаю эту ошибку: 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

Я думаю, что ваша модель DB концептуально не правильно.

Это должно быть что-то вроде этого ниже.

Ocean_ship_id - это ПК стола ocean_ship. И средство_от_транспорта_ид от ocean_ship - это просто FK к таблице «base» означает_отпорт.

Таким образом, я бы сказал, что вы правильно используете свою модель БД, , а затем беспокоитесь о сопоставлении 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

Смежные вопросы