【问题标题】:JPA - Secondary Table mapping directionJPA - 辅助表映射方向
【发布时间】:2023-03-27 04:50:01
【问题描述】:

我有两张桌子:

CREATE TABLE Checkin (
  ID int primary key,
  foo varchar(100),
  bar varchar(100),
  FK_type int foreign key references Type(ID)
)

CREATE TABLE Type (
  ID int primary key,
  type varchar(100)
)

由于辅助表只存储标签,我想将值直接映射到我的实体中。我想应该可以使用@SecondaryTable...

@Table(name = "Checkin")
@SecondaryTable(name = "Type",
    pkJoinColumns = @PrimaryKeyJoinColumn(name="FK_type", referencedColumnName = "ID")
)
class Checkin {
  @Id
  private Integer id;

  private String foo;
  private String bar;

  @Column(name="FK_type", table="Type")
  private String type;
}

不幸的是,@SecondaryTable 注释似乎反过来工作,这意味着它希望我的实际主数据表与最多列成为一个连接。所以我得到了错误

Invalid column name 'FK_type'.

有没有办法通过不同的注释来解决这个问题,还是我真的需要反过来构建整个构造,并让主要实体引用“Type”和“Chekin”作为辅助表?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    你应该在 Checkin 中加入 Type 实体:

    class Checkin {
          @Id
          private Integer id;
        
          private String foo;
          private String bar;
        
          @OneToOne(cascade = CascadeType.ALL)
          @JoinColumn(name = "type_id", referencedColumnName = "id")
          private Type type;
        }
    

    【讨论】:

    • 这就是我首先要避免的。显然可以使用 getter 来返回实际的 String,但这会产生副作用,因为我们经常使用 lombok,因此加载值而不是将整个事物映射为实体是理想的
    • 我不知道)
    【解决方案2】:

    尝试纠正这个问题:

    @Column(name="FK_type", table="Type")
    private String type;
    

    到这里:

    @Column(name="type", table="Type")
    private String type;
    

    Type 只是没有FK_type 列,据我了解,您想在此处使用Type.type

    附:如果这是对 PK 的引用,您可以省略使用 referencedColumnName

    【讨论】:

    • 不能解决问题。 PkJoinColumn 注释中的 FK_type 抛出异常 (com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'FK_Type'),从 PkJoinColumn 的文档来看,这似乎是合乎逻辑的。 name 定义为“当前表的主键列的名称” referencedColumnName 被连接的表的主键列的名称。所以我的假设是 - 如原始帖子中所述 - 辅助表应该具有对我的主表的外键引用。不过在我的用例中没有多大意义......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2014-05-17
    • 2012-08-25
    • 2016-02-10
    • 2011-03-27
    • 2014-05-09
    • 2021-02-16
    相关资源
    最近更新 更多