我一直在使用JPA(实现Hibernate)一段时间,每次我需要创build实体时,我发现自己正在与AccessType,不可变属性,equals / hashCode …等问题挣扎。 所以我决定尝试找出每个问题的一般最佳做法,并写下来供个人使用。 我不介意任何人对此发表评论,或者告诉我我错在哪里。 实体类 实现Serializable 原因: 规范说你必须,但是一些JPA提供者不执行这个。 作为JPA提供程序的Hibernate不强制执行此操作,但如果尚未实现Serializable,则它可能会在ClassCastException的深处发生故障。 构造函数 用实体的所有必填字段创build一个构造函数 原因:构造函数应该始终保持创build的实例处于正常状态。 除了这个构造函数:有一个包私有默认的构造函数 原因:默认的构造函数需要Hibernate初始化实体; 私有是允许的,但包私有(或公共)可见性是需要的运行时代理生成和有效的数据检索没有字节码工具。 字段/属性 一般情况下使用字段访问,需要时使用属性访问 理由:这可能是最值得商榷的问题,因为没有一个明确而有说服力的论据(财产准入和实地准入); 然而,由于代码更清晰,封装更好,并且不需要为不可变字段创buildsetter,所以字段访问似乎是最受欢迎的 省略set不可变字段(访问types字段不需要) 物业可能是私人的 原因:我曾经听说受保护对于(Hibernate)性能更好,但是我可以在网上find的是: Hibernate可以直接访问公共,私有和受保护的访问方法以及公共,私有和受保护的字段。 这个select取决于你,你可以匹配它来适应你的应用程序devise。 等于/的hashCode 如果仅在持久化实体时才设置此ID,请勿使用生成的ID 优先:使用不可变的值形成一个唯一的业务密钥,并用它来testing相等性 如果唯一的业务密钥不可用,则使用在初始化实体时创build的非暂时性UUID ; 看到这个伟大的文章更多的信息。 从不涉及相关实体(ManyToOne); 如果此实体(如父实体)需要成为业务密钥的一部分,则仅比较该ID。 只要你使用属性访问types ,在代理上调用getId()将不会触发实体的加载。 示例实体 @Entity @Table(name = "ROOM") public class Room implements Serializable { private static final long serialVersionUID = 1L; @Id […]
我想从string中删除最后一个字符。 我试过这样做: public String method(String str) { if (str.charAt(str.length()-1)=='x'){ str = str.replace(str.substring(str.length()-1), ""); return str; } else{ return str; } } 获取string的长度 – 1,并用空白replace最后一个字母(删除它),但是每次运行程序时,都会删除与最后一个字母相同的中间字母。 例如,这个词是“崇拜者”; 我运行该方法后,我得到了“admie”。 我希望它能够返回“佩服”这个词。
我在Java中得到了一个简单的问题:如何将由Long.toString()获取的String转换为long ?
如果你不知道项目Lombok帮助解决了Java的一些烦恼,比如用注解来生成getter和setter,甚至像使用@Data生成简单的JavaBean 。 它可以真正帮助我,特别是在50个不同的事件对象,你有多达7个不同的领域,需要构build和隐藏与获取。 我可以用这个删除近千行代码。 不过,我担心从长远来看,这将是一个遗憾的决定。 当我提到它时,Flamewars会爆发,提供代码片段会混淆可能的帮助者, 人们会抱怨缺lessJavaDoc ,未来的commiters可能只是将其删除。 我真的很喜欢这个积极的东西,但是我担心这个消极的东西。 那么,在任何小型或大型项目上使用都可以安全吗? 这些积极的影响是否值得消极?
考虑: int[][] multD = new int[5][]; multD[0] = new int[10]; 这是如何创build一个5行10列的二维数组? 我在网上看到这个代码,但是语法没有意义。
我试图拖延 – 或者让我睡觉 – 我的Java程序,但发生错误。 我无法使用Thread.sleep(x)或wait() 。 出现相同的错误信息: 未报告的exceptionjava.lang.InterruptedException; 必须被逮捕或宣布被抛出。 在使用Thread.sleep()或wait()方法之前是否需要执行任何步骤?
我想在这段代码中使用常量而不是string文字: new InputStreamReader(new FileInputStream(file), "UTF-8") 代码中经常会出现"UTF-8" ,并且会更好地引用一些static finalvariables。 你知道我可以在JDK中find这样一个variables吗? 顺便说一句,第二个想法,这样的常量是不好的devise: 公共静态文字…不是数据复制的解决scheme
只是要清楚,我不是在寻找MIMEtypes。 假设我有以下input: /path/to/file/foo.txt 我想要一个方法来打破这个input,特别是扩展名为.txt 。 有什么build立在Java中做到这一点? 我想避免写我自己的parsing器。
有人可以build议围绕Date和Calendartypes目前的“最佳做法”。 在编写新代码时,是否最好始终支持Calendar ,还是在某些情况下, Date是更合适的数据types?
看看以下两种方法: public static void foo() { try { foo(); } finally { foo(); } } public static void bar() { bar(); } 运行bar()显然会导致一个StackOverflowError ,但运行foo()不(程序似乎无限期运行)。 这是为什么?