我使用roo shell创建了一些带有测试的实体:
roo> entity jpa --class ~.model.Entity1 --testAutomatically --activeRecord
roo> entity jpa --class ~.model.Entity2 --testAutomatically --activeRecord
...
roo> entity jpa --class ~.model.EntityN --testAutomatically --activeRecord
然后,我开始在我的IDE(IntelliJ想法)中创建它们之间的关系,使用JPA注释(@NotNull @OneToOne,@ OneToMany等)。在此过程中,我一直在运行集成测试,验证数据库架构。突然,我的一个测试失败了java.lang.NullPointerException。我已经想通了,不知何故roo已经改变了先前生成的Roo_DataOnDemand方面,因此所有引用的实体都变为“null”-initized。
我可以进行Push-In重构并手动初始化所有引用实体,但这太慢了。 roo方面生成器发生了什么?我该如何解决这个问题,以便roo生成器正确初始化所有引用?
答案 0 :(得分:0)
看起来Roo在“分组导入语句”方面存在问题,例如:
import javax.persistence.*
要解决此问题,只需展开实体内的星号即可。示例如下。
“越野车”实体:
...
import javax.persistence.*;
...
@RooJavaBean
@RooToString
@RooJpaActiveRecord
@RooEquals
@ValidAdvocateCount
public class Formation {
@NotNull
@ManyToOne
private Acol registrationAcol;
/**
*/
@NotNull
@OneToOne
private Contacts contacts;
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "formation")
private Set<Advocate> advocates = new HashSet<Advocate>();
}
该实体的自动生成方面无效(删除了无关的详细信息):
privileged aspect FormationDataOnDemand_Roo_DataOnDemand {
declare @type: FormationDataOnDemand: @Component;
private List<Formation> FormationDataOnDemand.data;
public Formation FormationDataOnDemand.getNewTransientFormation(int index) {
Formation obj = new Formation();
setContacts(obj, index);
setForm(obj, index);
setName(obj, index);
setRate(obj, index);
setRegistrationAcol(obj, index);
setResume(obj, index);
setReviewDate(obj, index);
setViews(obj, index);
return obj;
}
public void FormationDataOnDemand.setContacts(Formation obj, int index) {
Contacts contacts = null;
obj.setContacts(contacts);
}
public void FormationDataOnDemand.setRegistrationAcol(Formation obj, int index) {
Acol registrationAcol = null;
obj.setRegistrationAcol(registrationAcol);
}
}
固定实体导入示例:
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.OneToOne;
import javax.persistence.OneToMany;
import javax.persistence.ManyToOne;
import javax.persistence.CascadeType;
import javax.validation.constraints.NotNull;
在修复之后,这是一个有效的自动生成方面:
privileged aspect FormationDataOnDemand_Roo_DataOnDemand {
declare @type: FormationDataOnDemand: @Component;
private List<Formation> FormationDataOnDemand.data;
@Autowired
ContactsDataOnDemand FormationDataOnDemand.contactsDataOnDemand;
@Autowired
AcolDataOnDemand FormationDataOnDemand.acolDataOnDemand;
public Formation FormationDataOnDemand.getNewTransientFormation(int index) {
Formation obj = new Formation();
setContacts(obj, index);
setForm(obj, index);
setName(obj, index);
setRate(obj, index);
setRegistrationAcol(obj, index);
setResume(obj, index);
setReviewDate(obj, index);
setViews(obj, index);
return obj;
}
public void FormationDataOnDemand.setContacts(Formation obj, int index) {
Contacts contacts = contactsDataOnDemand.getSpecificContacts(index);
obj.setContacts(contacts);
}
public void FormationDataOnDemand.setRegistrationAcol(Formation obj, int index) {
Acol registrationAcol = acolDataOnDemand.getRandomAcol();
obj.setRegistrationAcol(registrationAcol);
}
}