如何在不从数据库中加载的情况下引用 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 支持它。
我已经使用 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 支持它。