4

这是我昨天问的这个问题的延续。在浏览了各种资源并咨询了人们之后,我找不到任何支持 API 的 JPA 注释,用于映射测量单位。所以,我决定自己去创造它。

基于Martin Fowler在他的著作《分析模式:可重用对象模型》中描述的各种观察和测量模式,我尝试创建一个基本实现来满足我的需求。我创建了两个实体,并且,如下所示: -UnitQuantity

单位实体:-

@Entity
@Table(name = "unit")
public class Unit {

    @Id
    @Column(name = "symbol")
    private String symbol;

    @Column(name = "name")
    private String name;

    @Column(name = "multiplier")
    private Number multiplier;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "symbol")
    private Unit baseUnit;

    public Unit() {

    }

    public Unit(String symbol, String name, Number multiplier, Unit baseUnit) {
        this.symbol = symbol;
        this.name = name;
        this.multiplier = multiplier;
        this.baseUnit = baseUnit;
    }

        /** Getters and Setters **/
}

数量实体:-

@Entity
@Table(name = "quantity")
public class Quantity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int quantityId;

    private Number amount;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "unit")
    private Unit unit;

    public Quantity() {

    }

    public Quantity(Number amount, Unit unit) {
        this.amount = amount;
        this.unit = unit;
    }

    /** Getters and Setters **/
}

Item实体中,我有一个Quantity实体的引用,代表我的unitOfIssueand unitOfPurchase。然后,无论我要处理一些数量,我都会有这个Quantity参考。

现在,这是我现在面临的问题。由于Quantity这里的课程将是一个entity. 因此,我们必须将其映射到DB Table。所以,这里需要注意的是,每次我想添加一些数量或更新数量时,都会先在Quantity表格中输入一个条目,然后在Item表格中更新它。我想,问题很清楚。我们将在Quantity表格中输入大量条目,这清楚地表明了一个糟糕的设计。

有人可以对我在 JPA 中实现此模式时的方法以及我有哪些选择提供见解吗?我该如何解决这个问题?

4

3 回答 3

1

我会推荐这个。由于度量单位不太可能经常更改,因此值得将它们构建到代码中。这样您就可以有意义地使用程序本身中的值。

如果它将在其他任何地方使用,它还会使数据库更具凝聚力。您还可以将 Quantity 扩展为 LinearQuantity、AreaQuantity、VolumetricQuantity(等),以确保不会有人试图购买 30 英尺的石油。

@Embeddable
public class Quantity{

   public enum Unit {FEET,METERS,INCHES,MM}

   @Enumerated( value = EnumType.STRING)
   private Unit unit;

   private Number amount;

   public Quantity() {

   }
}


@Entity
Public Class PurchaseOrder
{
    @Embedded
    @AttributeOverrides({
      @AttributeOverride(name="unit", column=@Column(name="UNIT")),
      @AttributeOverride(name="amount", column=@Column(name="AMOUNT"))
    })
    private Quantity quantity;
    ....

}
于 2013-01-12T01:51:28.410 回答
0
  • 您需要一个单位主表,其中包含固定的所有单位,以便您可以创建简单的脚本来填充它。
  • 对于数量,我不会推荐一个单独的实体,它可以是事务表的属性,它可以简单地在项目的数量和单位之间建立关系,你可以@OneToOne使用单位实体来做到这一点。

这是示例示例

@Entity
Public Class PurchaseOrder
{
@OneToOne
private Unit unitOfPurchase;
@OneToOne
    private Unit unitOfIsuse;

-- Quanity number here ---
}

您应该Cascade非常小心地使用主表。

于 2013-01-11T07:31:08.413 回答
0

查看这个 JPA 库,了解流行的 JScience 项目:JScience-JPA

基于对Java 货币类型(JSR 354) 的类似支持,我们还计划为JSR 363添加类似的东西

于 2016-02-13T15:08:42.613 回答