1

ここに私のエンティティのスニペットがあります(Javaによって生成されたデフォルトのものであるハッシュコードとequalsも作成されています

@Entity 
@Table(name = "media_tspec_external_registry")
public class Registry implements Serializable {


public Registry() {
    //for hibernate :D
}



public Registry(String show, String protocol, String externalEndpoint, String userURI, String version) {
    super();
    this.show = show;
    this.protocol = protocol;
    this.externalEndpoint = externalEndpoint;
    this.userURI = userURI;
    this.version = version;
}




@Id
@Column(name = "show", nullable = false)
private String show;

@Id
@Column(name = "protocol", nullable = false)
private String protocol;

@Column(name = "external_endpoint", nullable = true)
private String externalEndpoint;

これらのキー値に基づいて、存在しないエンティティをロードしようとしている私のメソッドは次のとおりです

Registry reg = new Registry("invalid", "idvalue", null, null, null);
    Registry reg2 = null;
    try {

        reg2 = (Registry) session.load(Registry.class, reg);
             } catch (HibernateException e) {
        throw new UserException("A registry entry does not exist for this show: " + show + " and protocol: " + protocol);
        }

例外はスローされず、reg2 はすべてのフィールドが null に設定されたレジストリ オブジェクトに設定されます。

また、ロードは既存のエンティティをロードしないことにも注意しました。

ただし、代わりにgetを使用すると、期待どおりに機能します(存在しないオブジェクトに対してnullを返す有効なオブジェクトをロードします)

reg2 = (Registry) session.get(Registry.class, reg);

説明をいただければ幸いです。

ありがとう

4

1 に答える 1

1

これは予期される動作です。session.load は、参照を満たすために使用できるオブジェクトを取得することを目的としています。

User u = new User();
u.setRole((Role)session.load(Role.class, 5));
session.save(u);

load はラウンドトリップを生成しません。利用可能なオブジェクトへの参照がない場合、プロキシオブジェクトを作成するか、場合によっては複合キーオブジェクトをリサイクルし、エンティティが存在するかどうかをデータベースに問い合わせることができないため、エンティティが存在することに依存します。

于 2012-04-26T10:04:15.353 に答える