当前位置: 首页 > news >正文

山西省网站建设_网站建设公司_悬停效果_seo优化

为什么做网站ppt,经销商怎么做网站,做网站设计参考文献,googleseo关键词每个Java对象都继承了equals和hashCode方法#xff0c;但它们仅对Value对象有用#xff0c;对面向无状态行为的对象毫无用处。 尽管使用“ ”运算符比较引用很简单#xff0c;但是对于对象相等而言#xff0c;事情要复杂一些。 由于您负责告诉平等性对特定对象类型的含义… 每个Java对象都继承了equals和hashCode方法但它们仅对Value对象有用对面向无状态行为的对象毫无用处。 尽管使用“ ”运算符比较引用很简单但是对于对象相等而言事情要复杂一些。 由于您负责告诉平等性对特定对象类型的含义因此必须使equals和hashCode实现遵循java.lang.Object JavaDoc equals和hashCode 指定的所有规则。 了解您的应用程序及其使用的框架如何利用这两种方法也很重要。 幸运的是Hibernate不需要它们检查实体是否已更改为此具有专用的脏检查机制。 浏览Hiberante文档后我偶然发现了这两个链接 Equals和HashCode和Hiberante 4.3文档指出了需要两种方法的上下文 将实体添加到Set集合时 将实体重新附加到新的持久性上下文时 这些要求来自Object.equals的“ consistent ”约束使我们遵循以下原则 在所有JPA对象状态下实体必须等于其自身 短暂的 附上 超脱 移除只要该对象被标记为要移除并且它仍然驻留在堆上 因此我们可以得出以下结论 我们不能使用自动递增的数据库ID来比较对象因为瞬态和附加的对象版本不会彼此相等。 我们不能依赖默认的Object equals / hashCode实现因为在两个不同的持久性上下文中加载的两个实体最终将成为两个不同的Java对象因此违反了全状态相等性规则。 因此如果Hibernate使用相等性唯一地标识对象则在整个生命周期中我们需要找到满足此要求的属性的正确组合。 具有在整个实体对象空间中唯一的属性的那些实体字段通常称为业务密钥。 与合成数据库自动递增的ID相对业务密钥还独立于我们的项目体系结构中采用的任何持久性技术。 因此必须从我们创建实体的那一刻起就设置业务密钥然后再也不要更改它。 让我们以实体相关性为例并选择适当的业务密钥。 根实体用例没有任何父依赖项的实体 这是实现equals / hashCode的方式 Entity public class Company {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;Column(unique true, updatable false)private String name;Overridepublic int hashCode() {HashCodeBuilder hcb new HashCodeBuilder();hcb.append(name);return hcb.toHashCode();}Overridepublic boolean equals(Object obj) {if (this obj) {return true;}if (!(obj instanceof Company)) {return false;}Company that (Company) obj;EqualsBuilder eb new EqualsBuilder();eb.append(name, that.name);return eb.isEquals();} } 名称字段代表公司业务密钥因此被声明为唯一且不可更新。 因此如果两个Company对象具有相同的名称则它们相等而忽略了它可能包含的任何其他字段。 拥有EAGER的父级的子实体 Entity public class Product {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;Column(updatable false)private String code;ManyToOne(fetch FetchType.EAGER)JoinColumn(name company_id, nullable false, updatable false)private Company company;OneToMany(fetch FetchType.LAZY, cascade CascadeType.ALL, mappedBy product, orphanRemoval true)OrderBy(index)private Set images new LinkedHashSet();Overridepublic int hashCode() {HashCodeBuilder hcb new HashCodeBuilder();hcb.append(name);hcb.append(company);return hcb.toHashCode();}Overridepublic boolean equals(Object obj) {if (this obj) {return true;}if (!(obj instanceof Product)) {return false;}Product that (Product) obj;EqualsBuilder eb new EqualsBuilder();eb.append(name, that.name);eb.append(company, that.company);return eb.isEquals();} } 在此示例中我们始终会获取产品的公司并且由于产品代码在公司之间并不唯一因此我们可以在业务密钥中包含父实体。 父引用被标记为不可更新以防止违反equals / hashCode合同将产品从一家公司转移到另一家公司毫无意义。 但是如果“父级”具有“一组子级”实体并且您调用类似以下内容的方法则此模型将中断 public void removeChild(Child child) {children.remove(child);child.setParent(null); } 由于将父级设置为null因此这将破坏equals / hashCode合同并且如果子级对象是Set则不会在子级集合中找到子对象。 因此在使用具有此类equals / hashCode的Child实体的双向关联时要小心。 拥有LAZY父级的子实体 Entity public class Image {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;Column(updatable false)private String name;ManyToOne(fetch FetchType.LAZY)JoinColumn(name product_id, nullable false, updatable false)private Product product;Overridepublic int hashCode() {HashCodeBuilder hcb new HashCodeBuilder();hcb.append(name);hcb.append(product);return hcb.toHashCode();}Overridepublic boolean equals(Object obj) {if (this obj) {return true;}if (!(obj instanceof Image)) {return false;}Image that (Image) obj;EqualsBuilder eb new EqualsBuilder();eb.append(name, that.name);eb.append(product, that.product);return eb.isEquals();} } 如果在没有产品的情况下获取图像并且关闭了持久性上下文并且将图像加载到集合中则将得到LazyInitializationException如以下代码示例所示 List images transactionTemplate.execute(new TransactionCallbackList() {Overridepublic List doInTransaction(TransactionStatus transactionStatus) {return entityManager.createQuery(select i from Image i , Image.class).getResultList();} }); try {assertTrue(new HashSet(images).contains(frontImage));fail(Should have thrown LazyInitializationException!); } catch (LazyInitializationException expected) {} 因此我不建议使用该用例因为它容易出错并且要正确使用equals和hashCode我们总是需要始终初始化LAZY关联。 子实体不理父母 在此用例中我们只需从业务密钥中删除父级引用即可。 只要我们始终通过“父级子代”集合使用“子代”我们就很安全。 如果我们从多个父级加载子级并且业务键在这些父级中不唯一则不应将其添加到Set集合中因为Set可能会丢弃来自不同父级的具有相同业务键的Child对象。 结论 为实体选择正确的业务密钥并不是一件容易的事因为它反映了您在Hibernate范围内外的实体使用情况。 使用实体之间唯一的字段组合可能是实现equals和hashCode方法的最佳选择。 使用EqualsBuilder和HashCodeBuilder可以帮助我们编写简洁的equals和hashCode实现并且似乎也可以与Hibernate Proxies一起使用。 参考 Hibernate Fact来自我们JCG合作伙伴 Vlad Mihalcea的Equals和HashCode 位于Vlad Mihalcea的Blog博客中。 翻译自: https://www.javacodegeeks.com/2013/11/hibernate-facts-equals-and-hashcode.html
http://www.ihoyoo.com/news/5254.html

相关文章:

  • 福州网站建设策划方案站长统计app下载免费
  • 上海科技网站建设2022最好的百度seo
  • 了解做房产广告的网站网站建设 技术 哪些
  • 西充移动网站建设网站建设中 油财宝
  • 湖北住房和城乡建设厅网站网站关键词排名优化技巧
  • 网站作用微信手机网页版
  • wordpress标签大全文档seo优化排名公司
  • 都昌网站建设高端的扬中网站建设
  • 重庆哪家制作网站好摄影网站开发背景
  • 北京制作网站的公司简介网站页面多大合适
  • 网站开发需求书模板信息流广告代运营
  • 四川省建设厅网站官网网页设计模板html代码教程
  • 二级网站建设 知乎品牌建设的创新与特色
  • 最好用的网站建设软件建设企业网站的好处是什么
  • 槐荫区网站建设苏州建网站的公司外包服务
  • 医院网站做品牌推广需要哪些建设机械 官方网站
  • 网站优化检测召唤神龙网页小游戏在线玩
  • 网站开发 设置背景图片如何做基金公司网站
  • .net给网站做短信验证p2p万能搜索种子
  • 学校网站开发招标php网站后台入口
  • 门户网站制作流程给个网站谢谢各位了
  • 融资西安稳定的seo
  • 网站维护费用一年多少淘宝流量网站
  • 天津城市建设网站网页界面设计要重点掌握哪四个要点
  • 网站建设域名所有权申请一个域名多少钱
  • 北京建站管理系统价格装修公司排名榜十大品牌
  • 在线crm网站网站建设服务 杭州
  • 动易网站cms漳州城乡和建设局网站首页
  • 网站算信息化建设专业南京网站建设
  • 汕头做网站优化公司网站备案注销申请书