@ManyToOne映射,没有中间表的实体

时间:2020-07-15 15:41:20

标签: database hibernate jpa spring-data-jpa

我正在编写一个将查询无法更改的大型数据库的应用程序。

由于这个原因,我的应用程序不需要映射所有对象,因为那将是无用且耗时的。

其中映射的所有实体均为@Immutable

我遇到了这种关系:

Database

我想映射Order,并使其引用Customer。实际上,这是一个多对一关系,只是发生了两两个Join子句。

我对RB都不感兴趣,因为他们没有传达与我的要求有关的信息。

我设想这样的事情,但是我知道语法无效:

@Entity
@Immutable
@Table(name = "Order")
public class Order implements Serializable {
    
   @Id
   @Column(name = "id")
   private Long id;

   @ManyToOne
   @JoinColumns(value = 
              @JoinColumn(table = "R", name = "id", referencedColumnName = "R_id"),
                @JoinColumn(table = "Customer", name = "id", referencedColumnName = "Customer_id")
    )
    private Customer customer;
    
    ... more data and getters/setters omitted ...
}
    
    
@Entity
@Immutable
@Table(name = "Customer")
public class Customer implements Serializable {
    
   @Id
   @Column(name = "id")
   private Long id;
    
    
   ... more data and getters/setters omitted ...
}

有没有一种方法可以为R创建一个实体?

编辑:-------------------------

根据建议,我尝试了以下操作:

@ManyToOne
@JoinTable(name = "R",
     joinColumns = @JoinColumn(name = "id", referencedColumnName = "R_id"),
     inverseJoinColumns = @JoinColumn(name = "id", referencedColumnName = "Customer_id"))
private Customer customer;

但是,出现以下错误:

Unable to find column with logical name: R_id in org.hibernate.mapping.Table(Order) and its related supertables and secondary tables

1 个答案:

答案 0 :(得分:0)

对于以下模式,您可以使用@JoinTable批注。

ManyYoOneWithIntermTable

以这种方式

@Entity
@Table(name = "Order")
public class Order {

    // ...

    @ManyToOne
    @JoinTable(
        name = "R",
        joinColumns = @JoinColumn(name = "ord_id"),
        inverseJoinColumns = @JoinColumn(name = "customer_id"))
    private Customer customer;

    // ...
}

但是对于您而言,由于R中缺少对Order表的外键,因此似乎无法避免在中间表R中使用实体。

相关问题