gpt4 book ai didi

java - 将主键作为外键映射到另一个表

转载 作者:可可西里 更新时间:2023-11-01 07:58:59 26 4
gpt4 key购买 nike

我有一个关于外键关系及其 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]

最佳答案

我认为您的数据库模型在概念上是不正确的。

下面应该是这样的

ocean_ship_id 是ocean_ship 表的PK。来自 ocean_ship 的 means_of_transport_id只是“基本”表 means_of_transport 的 FK。

所以我会说你的数据库模型是正确的,然后担心 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 )
);

关于java - 将主键作为外键映射到另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20180933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com