我正在尝试编写一个简单的应用程序,该应用程序包含一个表,该表跟踪每个用户已支付的款项,另一个表中包含每个用户已支付的总金额(所有付款的总和)。当前,两个表具有相同的字段(名字,姓氏,金额),并且我已经从同一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
}
答案 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。这是您最简单的选择。