gpt4 book ai didi

java - 如何引用 Hibernate @ManyToOne 关联而不从数据库中加载它

转载 作者:行者123 更新时间:2023-11-30 03:27:16 25 4
gpt4 key购买 nike

我使用 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() 返回 null。

有什么想法可以实现这一目标吗?

<小时/>

编辑

它按预期工作,使用 PK 集创建一个新对象。

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

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

ErrorEntity error = new ErrorEntity();

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

error.setSignal(signal);

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

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

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

最佳答案

ErrorEntity 有两个 ErrorEntity.ENV_ID 映射,除非您使用 @MapsId那么就是配置问题。

您应该在 EnvironmentEntity 表中有一个 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 支持它。

关于java - 如何引用 Hibernate @ManyToOne 关联而不从数据库中加载它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29896121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com