0

在观察一些日志条目时,我观察到一种行为,我不明白。我重新创建了场景。

实体:

@Entity
public class SimpleEntity implements Serializable {

    private static final long serialVersionUID = 2777681889998131084L;

    @Id
    @GeneratedValue
    private Long id;
    @Version
    private Long version;
    @Column(length = 20, nullable = false, unique = true, updatable = false)
    @NotNull
    private String username;
    @Column(length = 60)
    private String email;

    // Constructors

    // getters/setters

    // @Override
    // toString : generated by eclipse, modified to include super.toString
    // hashCode, equals : generated by eclipse, based on 'username'

}

测试用例

@Test
public void testUpdate() {
    SimpleEntity simple;
    SimpleEntity simple2;

    try {
        simple = bean.create(new SimpleEntity("user",
                "original@original.com"));  // em.persist
        simple.setEmail("updated@updated.com");
        simple2 = bean.update(simple);          // em.merge
        System.out.println(simple);
        System.out.println(simple2);
    } catch (EJBException e) {
        System.out.println(e.getMessage());
    }
}

它打印与上述 System.out.println 行对应的以下行

...SimpleEntity@36ebea SimpleEntity [id=1, version=1, username=user, email=updated@updated.com]
...SimpleEntity@36ebea SimpleEntity [id=1, version=2, username=user, email=updated@updated.com]

我觉得奇怪的是两个实体的地址相同(SimpleEntity@36ebea),但如果我查看数据,它就不一样了。“版本”不同。( 1 & 2 )

相同的实例(地址相同)如何显示不同的数据?有一些代理在玩吗?如何?

4

1 回答 1

1

simple并且simple2实际上是两个不同的实例。你说“toString:由eclipse生成,修改为包含super.toString”。继承toString()Object看起来像:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

所以@36ebea不是对象的地址,而是它的哈希码(仅基于username)对于不同的实例保持相同,只有不同的实例version

您可能希望使用System.identityHashCode()从对象的地址派生的哈希码(hashCode()如果您没有覆盖从 继承的那个,它基本上会返回您从调用中获得的内容Object)。

于 2013-02-20T15:10:36.610 回答