我正在尝试使用 servlet 和 jsps 的 Web 应用程序,并且需要在我的班级以及休眠映射中对项目的 isbn 编号进行建模。哪个应该是 isbn 数字的类型?Long 还是 String?我遇到过许多使用它们中的任何一个的教程.. isbn 应该是一个 10 位数的标识符..有时你会遇到像 0-85131-041-9 这样的数字,它不能是长的..有些例子使用没有连字符的数字..
那么,应该是哪种类型?有什么建议么?
谢谢
标记
我正在尝试使用 servlet 和 jsps 的 Web 应用程序,并且需要在我的班级以及休眠映射中对项目的 isbn 编号进行建模。哪个应该是 isbn 数字的类型?Long 还是 String?我遇到过许多使用它们中的任何一个的教程.. isbn 应该是一个 10 位数的标识符..有时你会遇到像 0-85131-041-9 这样的数字,它不能是长的..有些例子使用没有连字符的数字..
那么,应该是哪种类型?有什么建议么?
谢谢
标记
实际上 ISBN 不是 10 位而是 12 位 + 支票ISBN FAQ支票可以是 X
确定 ISBN 校验位的方法是模数 11,加权因子为 10 到 1。罗马数字 X 用于代替 10,其中十位将作为校验位出现。
如果您要存储用户输入的信息,那么您应该包含校验位,因此它必须是一个字符串。
如果您要存储实际的 ISBN,那么您可以忽略该支票,因为您可以计算它。但是,如果使用新的 12 位数字,则数字大于 long 可以容纳的数字,如果旧的 10 位数字可以容纳 long,但您必须记住可能添加前导 0。因此,在这种情况下,我会将它保存在一个字符串中,删除所有非数字数据,例如连字符。
还要查看该常见问题解答,可能有理由将 ISBn 分开存储以允许按部分搜索。
ISBN 的五个部分如下:
1. 当前的 ISBN-13 将以“978”为前缀
2. 标识出版商的国家或地理分组的组或国家标识符;
3. 发布者标识符,用于标识组内的特定发布者;
4. 标识特定标题或标题版本的标题标识符;
5. 校验位是 ISBN 末尾的单个数字,用于验证 ISBN。
并且 5 不需要保存,因为它可以计算,但需要从用户那里获取以验证条目。
ISBN 有 13 位数字(参见wiki)。我会使用一个类来检查 given 的有效性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
很好。
编辑连字符将数字分成组(语言、出版商等)。但是,对于数字的唯一性,连字符(或用空格分隔)不起作用。
这个问题实际上与 J2EE 没有任何关系,而只是与 Java 数据类型以及您的数据库引擎上的数据类型有关。
如果您想在任何输出中包含连字符,则几乎必须将其存储为字符串。除非您想编写代码来确定连字符的位置,但其背后的规则相当复杂,具体取决于数字开头的数字值。(如果您正在开发一个分配 ISBN 或将它们拆开并处理碎片的系统,也许您想这样做。如果您只想让用户输入并记住它,这听起来太麻烦了.)
我想如果你不关心连字符,你可以使用字符串或长字符。不过,long 将是一个额外的痛苦,因为您必须弄清楚何时显示前导零。
简短的回答:我认为将其存储为数字没有任何好处。使用字符串。
我将它存储在一个Long
属性中并使用格式化程序/解析器(本质上是一个转换器)。当您要显示它时,转换器应该将Long
属性转换为在正确位置带有连字符的人类表示。当您要验证/保留它时,转换器应从提交的值中删除所有连字符并将其放入Long
属性中。
Date
基本上,它与您用于在人类表示中格式化/解析的字段的想法相同SimpleDateFormat
。唯一的区别是标准 Java SE API 不提供 ISBN 格式化程序/解析器。您需要自己编写一个或采用第 3 方的一个(不过,其中没有一个出现在脑海中)。最后,这个转换器可以用作 JSP 标记(如 JSTL's <fmt:formatDate>
)或由 EL 函数调用的独立 Java 类,或者当您使用 JSF 时,一个@FacesConverter
类。
由于 ISBN 编号的复杂性,这确实比通常存储为更多,String
因此开发人员无需担心有效模式。这是好是坏是你必须问自己和你的团队的问题。