J2EEアプリでISBN番号をモデル化する正しい方法
質問
サーブレットとJSPを使用してWebアプリを試していますが、クラスのISBN数とHibernateマッピングでアイテムの数をモデル化する必要があります。 ISBN番号のタイプはどれですか?ロングまたは文字列?私はそれらのいずれかを使用する多くのチュートリアルに出くわしました。ISBNはおそらく10桁の識別子です。時々、0-85131-041-9のような数字に出くわします。
それで、どちらがタイプですか?助言がありますか?
ありがとう
マーク
解決
私はそれをaに保存します Long
プロパティとフォーマッタ/パーサー(基本的にコンバーター)を使用します。表示する場合、コンバーターは Long
適切な場所にハイフンを含む人間の表現への財産。検証/持続する場合、コンバーターは提出された値からすべてのハイフンを削除し、 Long
財産。
基本的に、それはあなたが使用するのと同じ考えです Date
人間の表現でフォーマット/解析するフィールド SimpleDateFormat
. 。唯一の違いは、ISBNフォーマッタ/パーサーが標準のJava SE APIで利用できないことです。自分で書くか、サードパーティの1つを採用する必要があります(存在するものはありませんが、頭に浮かぶものはありません)。最後に、このコンバーターはJSPタグとして使用できます(JSTLのように <fmt:formatDate>
)またはEL関数によって呼び出されるスタンドアロンのJavaクラス、またはJSFを使用しているとき、 @FacesConverter
クラス。
ISBN番号の複合項目により、これは実際にはしばしば保存される以上のものです String
開発者は有効なパターンを心配する必要がないようにします。それが良いか悪いかは、あなた自身とあなたのチームを尋ねなければならない質問です。
他のヒント
ISBNには13桁があります(参照してください ウィキ)。指定された有効性をチェックするクラスを使用します String
. 。何かのようなもの:
class ISBN {
private String isbn;
public ISBN(String isbn) throws ISBNFormatException {
// you might want to filter hyphens first, before the check
if(ISBN.isValid(isbn)) this.isbn = isbn;
else throw new ISBNFormatException(isbn);
}
public static boolean isValid(String s) {
// validate number here, see wiki
}
}
もちろん、これは少し多すぎるかもしれません。アプリが本当に簡単な場合は、一緒に行くことができます String
大丈夫です。
編集 ハイフネーションは、数をグループ(言語、出版社など)に分割します。ただし、数の独自性に関しては、ハイフネーション(またはスペースのある分裂)は役割を果たしません。
実際、ISBNは10桁ではなく、12桁 +チェックです ISBN FAQ チェックはxにすることができます
ISBNのチェックディジットを決定する方法は、重み係数10〜1の弾性11です。ローマ数字Xは、10個の桁として10個の場合に使用されます。
ユーザーが入力した情報を保存している場合は、チェックディジットを含める必要があるため、これは文字列でなければなりません。
実際のISBNを保存している場合は、計算できるチェックを無視できます。ただし、新しい12桁を使用すると、数値が長いよりも大きくなります。古い10桁が長く保持される場合は、長い段階で保持できますが、先行0秒を追加することを忘れないでください。したがって、この場合、ハイフンなどのすべての非数値データを削除する文字列に保持します。
また、そのFAQを見ると、ISBNの分割を保存して部品ごとに検索できるようにする理由があります。
ISBNの5つの部分は次のとおりです。
1.現在のISBN-13には「978」が付けられます
2.出版社の国家または地理的グループを識別するグループまたは国の識別子。
3.グループ内の特定のパブリッシャーを識別するパブリッシャー識別子。
4.タイトルの特定のタイトルまたはエディションを識別するタイトル識別子。
5.チェック桁は、ISBNを検証するISBNの終わりにある1桁です。
5つは計算できるため保存する必要はありませんが、エントリを検証するにはユーザーからキャプチャする必要があります。
この質問は、J2EEとは何の関係もありませんが、Java DataTypesとデータベースエンジンのデータ型だけでは関係ありません。
任意の出力にハイフンを含めたい場合は、弦として保存する必要があります。ハイフンがどこに行くのかを把握するためにコードを作成したい場合を除き、数字の先頭にある数字の値に応じて、その背後にあるルールはかなり複雑です。 (ISBNを割り当てたり、分解して作品を使用して作業したりするシステムで作業している場合は、これをやりたいと思うかもしれません。 。)
ハイフンを気にしない場合は、ひもまたは長いものを使用できると思います。それでも、長い間は、主要なゼロをいつ表示するかを把握する必要があるということです。
簡単な答え:それを数として保存する利点はありません。文字列を使用します。