Tag: equals

创build完美的JPA实体

我一直在使用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 […]