java - 使用现有列添加 ManyToOne 映射

标签 java postgresql jpa spring-data-jpa spring-jdbc

我遇到过一种情况,我必须在两个表之间建立多对一关系,前提条件如下:

表A:

-----primary_key_a------------column_a--------column_x---------

例子:

--------1----------------------------2050--------ABC

--------2----------------------------2050--------AAA

--------3----------------------------9090--------ABC

------4----------------------------9090--------AAA

表 B:

-----primary_key_B------------column_B--------column_C------------

例子:

------2050----------------------------SSS--------KKK

------2090----------------------------YYY--------KKK

如两个表所示,primary_key_B 和column_a 具有相同的值,但在现有表中,它们具有不同的列名(表B 的primary_key_B 和表A 的column_a)。在现有记录中,有些情况下 primary_key_B 的某些值可能不在 column_a 中,反之亦然,但我们希望进一步填充它

我现有的 table_a 和 table_b 的 POJO 如下:

    @Entity
    public class PojoForA
    {

        @Id
        @Column(name = "primary_key_a")
        private Integer id;

        @Column(name = "column_a")
        private String b;
        @Column(name = "column_x")
        private String c;
       //getter/setters
}

@Entity
public class PojoForB
{

    @Id
    @Column(name = "primary_key_B")
    private Integer idB;

    @Column(name = "column_b")
    private String b;
    @Column(name = "column_c")
    private String c;
   //getter/setters

然后我在 Pojo A 中为多对一映射添加了以下更改:

@Entity
public class PojoForA
{

    @Id
    @Column(name = "primary_key_a")
    private Integer id;

    @Column(name = "column_a")
    private String b;
    @Column(name = "column_x")
    private String c;

 @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "idB",nullable=false,referencedColumnName = "primary_key_B")
   //getter/setters

它没有建立我想要建立的关系。表A已经有不同名称但数据相同的列作为表B的主键。 当我尝试运行时,出现以下错误:

    Caused by: org.h2.jdbc.JdbcSQLException: Column "tablea0_.primary_key_B" not found; SQL statement:.........
org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
        at org.h2.message.DbException.get(DbException.java:179)
        at org.h2.message.DbException.get(DbException.java:155)
        at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:150)

我该如何解决这个问题?基本上,我不想改变表结构,但 table_a 和 table_b 之间有多对一的关系

最佳答案

您已将 ManoToOne 引用放在表 B 中。首先尝试映射您的实体。我可以在您的日志文件中看到有一列无法识别,名为 primary_key_b 的引用列必须具有表 A 的外键。

在映射中引用的方式是:

@JoinColumn(name = "primary_key_b", referencedColumnName = "column_a")
@ManyToOne(optional = true) // This is because you can have null values I understood.

关于java - 使用现有列添加 ManyToOne 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57205429/

相关文章:

java - 如何防止实体关系发生变化?

java - 错误 : conflicting types for JNI method

java - 可以接受多个键并返回多个值的 java-backend 缓存

mysql - 谁能推荐一个原生支持多个数据库的良好数据建模工具/数据建模器?

postgresql - 插入行时更新不同的表

java - JPA 配置 boolean 字段以保留为整数

java - 是否可以在 Windows 10 中获得较旧的 Windows 版本外观?

java - spring 和 JBoss7 中的 jndi 查找问题

sql - 错误 : column "owner_name" specified more than once

Java 按字符串查找和比较成员(也许是 JPA 功能?)