4

昨日の質問の続きです。さまざまなリソースを調べて人々に相談した後、測定単位をマッピングするための API をサポートする JPA アノテーションを見つけることができませんでした。それで、私はそれを自分で作成することにしました。

Martin Fowlerが著書「Analysis Patterns: Reusable Object Models」で説明している観察と測定に関するさまざまなパターンに基づいて、自分のニーズを満たす基本的な実装を作成しようとしました。以下のように、2 つのエンティティと を作成しました。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を表しています。そして、いくらかの量を扱わなければならないときはいつでも、この参照を持っています.unitOfIssueunitOfPurchaseQuantity

さて、ここで私が今直面している問題があります。ここの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

人気のある JScience プロジェクトの JPA ライブラリーJScience-JPAを確認してください。

Java Monetary タイプ(JSR 354)の同様のサポートに基づいて、 JSR 363にも同様のものを追加する予定です。

于 2016-02-13T15:08:42.613 に答える