繁体   English   中英

JPA:根据实例变量将实体动态映射到表

[英]JPA: dynamically mapping an Entity to a table based on an instance variable

这是我的问题:

class CurrencyPrice {
    @Transient
    String pair;
    float spotPrice;
    Date timeStamp;
}

我有3个表,其名称分别代表“欧元/英镑/日元的美元价值”:usd_euro,usd_gbp和usd_yen。 它们都有相同的3列:id,spotprice和timestamp。

由于某种原因,我不能有一个表。 瞬时实例变量“ pair”将根据其表示的内容具有以下值:“ usd_euro”,“ usd_gbp”和“ usd_yen”

  1. 并且根据“对”中的值,我想在其中一个表中插入一行,例如:如果我在“对”中具有值“ usd_yen”,则该对象应保留在usd_yen表中。

  2. 当我想获取数据时,我希望JPA根据“ pair”中的值来决定从哪个表中进行选择

这在JDBC中很简单,但是在JPA中有没有办法做到这一点?

谢谢。

如果我没有理解你的要求,这实际上可能是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;
}

我在每个子类上复制了spotPricetimeStamp ,因此您不必修改现有的表定义-当然,将它们仅包含在超类/ timeStamp表上会更清洁。

例如,此映射允许它执行EntityManager.persist(new UsdGbpPrice(...))并使JPA在正确的表中插入一行。 有关更多信息,请参见此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM