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)で同じですが、データを見ると同じではありません。「バージョン」が異なります。(12

同じインスタンス(アドレスが同じであるため)で、異なるデータを表示するにはどうすればよいですか?プロキシが機能していますか?どうやって?

4

1 に答える 1

1

simplesimple2は、実際には 2 つの異なるインスタンスです。「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 に答える