【发布时间】:2015-01-29 11:47:39
【问题描述】:
我正在使用 Hibernate 4.3.8.Final 并且在检索延迟获取属性的 @Id 属性时遇到问题:对于调用 aidConfiguration.getChipApplication().getId() 的附加类,总是返回 null。其他属性,例如。 aidConfiguration.getChipApplication().getVersion() 正确返回 DB 中的值。如果chipApplication 没有延迟加载(参见代码中的注释),则aidConfiguration.getChipApplication().getId() 返回正确的非空值。
我哪里错了?
顺便说一句,我需要它变得懒惰。
基础实体:
@MappedSuperclass
public class BaseEntity implements Serializable {
@Id
@Column(name = "ID", unique = true)
@Size(min = 1, max = 255)
private String id;
@PrePersist
public final void generateUuid() {
if (this.getId() == null) {
this.setId(UUID.randomUUID().toString());
}
}
public final String getId() {
return id;
}
public final void setId(final String id) {
this.id = id;
}
}
辅助配置:
@Entity
@Audited
public class AidConfiguration extends BaseEntity {
@Column
@NotBlank
private String name;
@NotNull
@ManyToOne(fetch = FetchType.LAZY) // if it is EAGER (defaut) then then aidConfiguration.getChipApplication().getId() returns correctly non-null value
private ChipApplication chipApplication;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "aidConfiguration", cascade = CascadeType.ALL) // cascade for auto-saving and deleting items
private List<AidConfigurationItem> aidConfigurationItems;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public ChipApplication getChipApplication() {
return chipApplication;
}
public void setChipApplication(final ChipApplication chipApplication) {
this.chipApplication = chipApplication;
}
public List<AidConfigurationItem> getAidConfigurationItems() {
return aidConfigurationItems;
}
public void setAidConfigurationItems(final List<AidConfigurationItem> aidConfigurationItems) {
this.aidConfigurationItems = aidConfigurationItems;
}
}
芯片应用:
@Entity
@Audited
public class ChipApplication extends BaseEntity {
@Column
@NotBlank(message = "Aid can not be empty")
private String aid;
@Column
@NotBlank(message = "Product can not be empty")
private String product;
@Column
@NotBlank(message = "Version can not be empty")
private String version;
@NotNull(message = "Network is mandatory")
@ManyToOne(fetch = FetchType.LAZY)
private Network network;
@ManyToMany(fetch = FetchType.EAGER)
private List<AidTag> aidTags;
public String getAid() {
return aid;
}
public void setAid(final String aid) {
this.aid = aid;
}
public String getProduct() {
return product;
}
public void setProduct(final String product) {
this.product = product;
}
public String getVersion() {
return version;
}
public void setVersion(final String version) {
this.version = version;
}
public Network getNetwork() {
return network;
}
public void setNetwork(final Network network) {
this.network = network;
}
public List<AidTag> getAidTags() {
return aidTags;
}
public void setAidTags(final List<AidTag> aidTags) {
this.aidTags = aidTags;
}
}
【问题讨论】:
标签: java hibernate jpa lazy-loading