在JPA中保持计量单位

时间:2013-01-11 06:58:16

标签: java jpa units-of-measurement

这是this question的延续,我昨天问过。在浏览了各种资源和咨询人员之后,我无法找到任何支持API的JPA注释,用于映射测量单位。所以,我决定自己创建它。

基于Martin Fowler在他的书Analysis Patterns: Reusable Object Models中描述的观察和测量上的各种模式,我尝试创建一个基本实现满足我的需求。我创建了两个实体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实体的引用,代表我的unitOfIssueunitOfPurchase。然后,无论我在哪里处理一些数量,我都会有Quantity引用。

现在,这是我现在面临的问题。由于此处的Quantity课程为entity。因此,我们必须将其映射到数据库表。所以,这里需要注意的是,每当我想添加一些数量或更新数量时,一个条目将首先进入Quantity表,然后它将在Item表中更新。我想,问题很清楚。我们会在Quantity表中有大量的条目,这清楚地显示了一个糟糕的设计。

当我在JPA中实现此模式时,是否有人能够深入了解该方法以及我有哪些选择?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

我会建议这样做。由于计量单位不太可能经常变化,因此值得将它们构建到代码中。这样你就可以有意义地使用程序本身的值。

如果数据库可以在其他任何地方使用,它也会使数据库更具凝聚力。您还可以将数量扩展为LinearQuantity,ArealQuantity,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;
    ....

}

答案 1 :(得分:0)

  • 您需要一个主表单元,它将包含所有单元,因为您可以创建简单的脚本来填充它。
  • 对于数量我不会推荐一个单独的实体,它可以作为交易表的属性,它可以简单地建立项目的数量和单位之间的关系,你可以用单位实体的@OneToOne做到这一点。

以下是示例示例

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

-- Quanity number here ---
}

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

答案 2 :(得分:0)

查看此JPA库以获取流行的JScience项目:Map.merge(K, V, BiFunction)

基于对JScience-JPA(JSR 354)的类似支持,我们还计划为Java Monetary types 添加类似内容