2021-05-26

ORM框架之对象识别

文章目录

 

一、对象识别

        对数据库而言,其识别一条记录唯一性的方式是根据主键值,如果手上有两条记录,它们拥有同样的主键值,则它们在数据库中代表同一个字段的记录。

     

二、两种方式

     对Java而言,要识别两个对象是否为同一个对象有两种方式

  1. 内存地址识别(“= =”号识别)
  2. 根据equals()、hasCode()中 的定义

 

1.内存地址识别

    先探讨第一种Java的识别方式在Hibernate中该注意的地方,在Hibernate中,如果是在同一个session中根据相同查询所得到的相同记录,则它们会拥有相同的Java识别
 

Session session = sessions.openSession();
Person p1 = (Person)session.get(Person.class,1);
Person p2 =(Person)session.get(Person.class,1);
session.close();
System.out.println(p1= = p2);


    程序片段将会显示true的结果, 表示p1与p2是参考至同一对象


    如果是以下的情况则会显示false:

Session session1 = sessions.openSession();
Person.p1 = (Person)session.get(Person.class,1);
session1.close();
Session session2 = sessions.openSession(;
Person p2 = (Person)session.get(Person.class,1);
session2. close(;
System.out.println(p1 == p2);

    使用==来比较两个对象的记录是否代表数据库中的同一条记录是不可行的。如果您要有必要比较通过查询后两个对象的内容是否相同,必须重写equals()与hashCode()。

2.equals()、hasCode()

重写方法之一,equals()与hashCode( )的方法是根据数据库的identity,就是透过getid()方 法取得对象的id值并加以比较

1.hashCode( )方法

User.java

public int hashCode() {
        int result;
        result = getName ().hashCode();
        result= 18* result + getBirthday().hashCode();
        result= 18* result + getAge();
        return result;
        }

2.equals())方法

User.java

public boolean equals(Object obj) {
		//如果相同,返回true;如果obj为空,则false
		if(this == obj) return true;
		if(obj == null) return false;
		if(!(obj instanceof User)) {return false;}
	}
	//强转
	User other  =  (User)obj;
	if(id!=other.id) {
		return false;
	}
	if(age!=other.age) {
		return false;
	}
	//注意name是字符串,前提是name不为空,以下方法都重写了
	if(!name.equals(other.name)){
		return false;
	}
	if(!gender.equals(other.gender)){
		return false;
	}
	if(!birthday.equals(other.birthday)){
		return false;
	}

三、测试

    建立testObjectIndentify

    输出结果为true true false true

    false原因:c,d的地址不同,所以c,d引用值不同,因此不相等。

    第四个true:equals是默认引用,但此处equals重写,虽然引用不同,但内容是相同的。

try{
        sf =HibernateUtil.getSessionFactory();//sessionFactory单态模式
    session = sf.getCurrentSession();//保证每个读写线程有唯一的session的实例
    ts = session.beginTransaction();
    
    String a = "abc";
    String b ="abc";
    
    System.out.println(a == b);
    System.out.println(a.equals(b));
    
    String c = "pq";
    String d ="pq";
    
    System.out.println(c == d);
    System.out.println(c.equals(d));
    
    ts.commit();

总结

本文主要讲述了识别两个对象是否为同一个对象的两种方式,此处详细的解释并展示了equals()、hasCode()的相关代码。

2021-03-26 20:54:33,596 - Model - INFO - Epoch 1 (1/200): 2021-03-26 20:57:40,380 - Model - INFO - Train Instance Accuracy: 0.571037 2021-03-26 20:58:16,623 - Model - INFO - Test Instance Accuracy: 0.718528, Class Accuracy: 0.627357 2021-03-26 20:58:16,623 - Model - INFO - Best Instance Accuracy: 0.718528, Class Accuracy: 0.627357 2021-03-26 20:58:16,623 - Model - INFO - Save model... 2021-03-26 20:58:16,623 - Model - INFO - Saving at log/classification/pointnet2_msg_normals/checkpoints/best_model.pth 2021-03-26 20:58:16,698 - Model - INFO - Epoch 2 (2/200): 2021-03-26 21:01:26,685 - Model - INFO - Train Instance Accuracy: 0.727947 2021-03-26 21:02:03,642 - Model - INFO - Test Instance Accuracy: 0.790858, Class Accuracy: 0.702316 2021-03-26 21:02:03,642 - Model - INFO - Best Instance Accuracy: 0.790858, Class Accuracy: 0.702316 2021-03-26 21:02:03,642 - Model - INFO - Save model... 2021-03-26 21:02:03,643 - Model - INFO - Saving at log/classification/pointnet2_msg_normals/checkpoints/best_model.pth 2021-03-26 21:02:03,746 - Model - INFO - Epoch 3 (3/200): 2021-03-26 21:05:15,349 - Model - INFO - Train Instance Accuracy: 0.781606 2021-03-26 21:05:51,538 - Model - INFO - Test Instance Accuracy: 0.803641, Class Accuracy: 0.738575 2021-03-26 21:05:51,538 - Model - INFO - Best Instance Accuracy: 0.803641, Class Accuracy: 0.738575 2021-03-26 21:05:51,539 - Model - INFO - Save model... 2021-03-26 21:05:51,539 - Model - INFO - Saving at log/classification/pointnet2_msg_normals/checkpoints/best_model.pth 我有类似于这样的一段txt文件,请你帮我写一段代码来可视化这些训练结果
02-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值