我已经用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?
答案 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支持它。