使用复合键加载对象的Hibernate始终返回

时间:2012-04-25 17:50:29

标签: java hibernate

这是我的实体的片段(它还有hashcode和equals创建,这是java生成的默认实现

@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);

任何解释都将不胜感激。

由于

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 session.load用于获取可用于满足引用的对象,例如

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

加载不会产生往返。如果没有对可用对象的引用,它将创建一个代理对象,或者在您的情况下将回收您的compositekey对象并依赖于该实体存在,因为它不能询问数据库是否如此。