如何在不从数据库中加载的情况下引用 Hibernate @ManyToOne 关联

How to reference a Hibernate @ManyToOne association without laoding it from the database

我已经使用 Hibernate 4.3.8 创建了一些 Hibernate 映射。

@Entity
@Table(name = ErrorEntity.TABLE_ID)
@XmlRootElement(name = ErrorEntity.XML_ROOT_TAG)
public class ErrorEntity {

    /**
   * 
   */
    private static final long serialVersionUID = 8083918635458543738L;

    public static final String TABLE_ID = "Error";
    public static final String ERRORCODE = "error_code";
    public static final String ENV_ID = "envid";

    private Integer error_code;
    private Integer envId;
    private EnvironmentEntity environment;

    public ErrorEntity() {

    }

    @Id
    @Column(name = ErrorEntity.ERRORCODE)
    public Integer getError_code() {
        return error_code;
    }

    public void setError_code(Integer errorcode) {
        this.error_code = errorcode;
    }

    @Column(name = ErrorEntity.ENV_ID)
    public Integer getEnvId() {
        return envId;
    }

    public void setEnvId(Integer envId) {
        this.envId = envId;
    }

    @ManyToOne
    @JoinColumn(name = ErrorEntity.ENV_ID, referencedColumnName = EnvironmentEntity.ENV_ID, insertable = false, updatable = false)
    public EnvironmentEntity getEnvironment() {
        return environment;
    }

    public void setEnvironment(EnvironmentEntity environment) {
        this.environment = environment;
    }

}

如您所见,映射 属性 ENV_ID 被映射了两次。

这样我想我可以设置 JoinColumn 值而不查询数据库来获取映射对象,因为此时我有 JoinColumn 值。

ENV_ID 的值已正确写入数据库,但如果我稍后查询此 ErrorEntity 并尝试获取 EnvironmentEntity,则引用为空。

ErrorEntity error = (ErrorEntity) criteria.uniqueResult();
System.out.println(error.getEnvironment().getName());

getEnvironment() returns 空。

有什么实现方法吗?


编辑

使用 PK 集创建新对象的工作正常。

现在我有一个特殊的情况,它不起作用。 我需要引用另一个对象,其中 joincolumn 不是 PK。我知道我将加入的值是唯一的,但也有一些重复的值我不会加入。

但是 Hibernate 似乎无法自动映射这种关系。

ErrorEntity error = new ErrorEntity();

SignalEntity signal = new SignalEntity();
signal.setName(signalName);

error.setSignal(signal);

问题是在那种情况下我没有信号 ID (PK)。另一个想法是查询数据库,但那太慢了。

我试图创建一个包含 3 列的复合 PK,但这在另一个地方打破了逻辑。

是否可以创建两个独立的PK?

ErrorEntity 有两个 ErrorEntity.ENV_ID 映射,除非您使用 @MapsId,否则这是一个配置问题。

您应该在 EnvironmentEntity table 中有一个 env_id 列,并且只有:

@ManyToOne
@JoinColumn(name = ErrorEntity.ENV_ID, referencedColumnName = EnvironmentEntity.ENV_ID, insertable = false, updatable = false)
public EnvironmentEntity getEnvironment() {
    return environment;
}

ErrorEntity 中映射。

我的建议是删除这个:

@Column(name = ErrorEntity.ENV_ID)
public Integer getEnvId() {
    return envId;
}

要直接设置envId而不查询数据库并请求整个EnvironmentEntity,你可以这样做:

errrorEntity.setEnvironment(new EnvironmentEntity());
errrorEntity.getEnvironment().setEnvId(envId);

这不是 JPA 标准要求,但 Hibernate 支持它。