这是我遇到的问题:
class CurrencyPrice {
@Transient
String pair;
float spotPrice;
Date timeStamp;
}
我有3个表的名称分别代表“usd value of euro / gbp / yen”:usd_euro,usd_gbp& usd_yen。它们都有相同的3列:id,spotprice,timestamp。
出于某种原因,我不能拥有一张桌子。瞬态实例变量'pair'将根据其代表的含义具有以下值:“usd_euro”,“usd_gbp”& “usd_yen”
根据'pair'中的值,我想在其中一个表中插入一行,例如:如果我在'pair'中有值“usd_yen”,那么该对象应该保存在usd_yen表中。
当我想要获取数据时,我希望JPA根据'pair'中的值来决定选择哪个表
这在JDBC中很简单,但有没有办法在JPA中执行此操作?
谢谢。
答案 0 :(得分:1)
如果我正确理解您的要求,那么现在在JPA中可能实际可行(您引用的那些线程已经很老了),如果您可以在您的实体上使用继承和另外的连接表和如果可以接受的是每种类型的ID不是连续的。
你基本上可以这样定义你的类:
@Entity
@Table(name="curr_base") // choose a suitable name
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="currency", discriminatorType=DiscriminatorType.STRING) // your join table needs this column in addition to the id
public abstract class CurrencyPrice {
@Id
private int id;
}
@Entity
@Table(name="usd_euro")
@DiscriminatorValue("usd_euro")
public class UsdEuroPrice extends CurrencyPrice {
float spotPrice;
Date timeStamp;
}
@Entity
@Table(name="usd_gbp")
@DiscriminatorValue("usd_euro")
public class UsdGbpPrice extends CurrencyPrice {
float spotPrice;
Date timeStamp;
}
@Entity
@Table(name="usd_yen")
@DiscriminatorValue("usd_euro")
public class UsdYenPrice extends CurrencyPrice {
float spotPrice;
Date timeStamp;
}
我在每个子类上复制了spotPrice
和timeStamp
,这样您就不必修改现有的表定义 - 当然只有将它们放在超类/连接表上会更清晰
此映射允许它例如执行EntityManager.persist(new UsdGbpPrice(...))
并让JPA在右表中插入一行。有关更多信息,请查看here。