如何引用Hibernate @ManyToOne关联而不从数据库

时间:2015-04-27 12:42:35

标签: java hibernate jpa orm hibernate-mapping

我已经用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,则引用为null。

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

getEnvironment()返回null。

任何想法如何实现这一目标?

修改

使用PK设置创建一个新对象就像预期的那样。

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

然而,Hibernate似乎无法自动映射此关系。

ErrorEntity error = new ErrorEntity();

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

error.setSignal(signal);

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

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

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

1 个答案:

答案 0 :(得分:2)

ErrorEntity有两个ErrorEntity.ENV_ID映射,除非您使用@MapsId,否则会出现配置问题。

env_id表中应该有一个EnvironmentEntity列,而且只有:

@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支持它。