休眠:多个表,同一对象

时间:2020-09-12 11:01:00

标签: java sql database hibernate

我正在尝试编写一个简单的应用程序,该应用程序包含一个表,该表跟踪每个用户已支付的款项,另一个表中包含每个用户已支付的总金额(所有付款的总和)。当前,两个表具有相同的字段(名字,姓氏,金额),并且我已经从同一Java类映射它们 而且在将该类映射到多个表时遇到了麻烦。有什么简单的解决方案吗?

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

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @Column
  @NotNull
  private String firstNname;

  @Column
  @NotNull
  private String lastNname;

  @Column
  @NotNull
  private double amount;

... Constructor, getters and setters
}

3 个答案:

答案 0 :(得分:1)

您可以尝试使用@SecondaryTable annotation

类似这样的东西:

@Entity
@Table(name = "MY_PAYMENT")
@SecondaryTable(name = "MY_PAYMENT_DETAILS",
    pkJoinColumns = @PrimaryKeyJoinColumn(name = "pd_payment_id"))
public class Payment {

   @Id
   @Column(name = "p_id")
   private Long id;
   
   @Column(name = "p_first_name")
   private String firstNname;

   // ...
   
   @Column(name = "pd_amount", table = "MY_PAYMENT_DETAILS")
   private double amount;
}

假定您具有以下架构:

create table MY_PAYMENT
(
   p_id number,
   p_first_name varchar(200),
   CONSTRAINT MY_PAYMENT_PK PRIMARY KEY(p_id)
);

create table MY_PAYMENT_DETAILS
(
   pd_payment_id number,
   pd_amount number,
   CONSTRAINT MY_PAYMENT_DETAILS_PK PRIMARY KEY(pd_payment_id),
   CONSTRAINT MY_PAYMENT_DETAILS_FK foreign key(pd_payment_id) references MY_PAYMENT(p_id)
);

另请参见休眠文档的this部分。

答案 1 :(得分:1)

您需要:

@MappedSuperclass public class ClassWithTheFields{ \\Not annotated with @Entity @Id private Integer Id; ... }

@Entity public class EntityClass extends ClassWithTheFields{}

@Entity public class AnotherEntityClass extends ClassWithTheFields{}

这样,两个扩展ClassWithTheFields的类将具有相同的字段,但将映射不同的表。

您只需要将所有公共字段放在一个@MappedSuperclass注释的类中,而不是@Entity,然后将该类扩展到其他以@Entity注释的类中。

答案 2 :(得分:1)

您应该使用@MappedSuperclass。这是您最简单的选择。