play framework Fixture.deleteAll()
2615 단어 Sybase
클래스 를 수정 하고 프로그램 을 시작 할 때마다 예 정 된 테스트 데이터 만 사용 하기 위해 서 저 는 클래스 를 썼 습 니 다.프로그램 이 시 작 될 때 표 데 이 터 를 지우 고 yml 파일 에 적 힌 데 이 터 를 가 져 옵 니 다.
@OnApplicationStart
public class Bootstrap extends Job {
@Override
public void doJob() {
Fixtures.deleteAll();
Fixtures.load("data.yml");
}
}
저희 프로젝트 에서 사용 하 는 데이터 베 이 스 는 sybase 이기 때문에 저 는 데이터 베 이 스 를 sybase 테스트 프로그램 으로 설정 하고 데이터 베이스 에 이 프로그램 이 사용 하지 않 는 표 가 있 습 니 다.결과 프로그램 이 시 작 된 후 전체 데이터 베 이 스 를 비 웠 습 니 다!
그 이 유 는 Fixtures.deleteAll()이 데이터베이스 의 모든 시 계 를 옮 겨 다 니 며 표 마다 truncate 나 delete 를 하기 때 문 입 니 다.
Fixtures.deleteAllModels()라 는 방법 으로 정 의 된 Model 의 데이터 만 삭제 하고 다른 표 는 삭제 하지 않 습 니 다.이 방법 도 단점 이 있 습 니 다.JPABase 를 계승 하 는 클래스 에 대응 하 는 시 계 는 모두 비 워 집 니 다.예 를 들 어 Model 에 기본적으로 Long 형식의 id 필드 가 있 기 때 문 입 니 다.
@MappedSuperclass
public class Model extends GenericModel {
@Id
@GeneratedValue
public Long id;
public Long getId() {
return id;
}
}
하지만 UUID 를 ID 로 바 꾸 고 싶 어서 GenericModel(GenericModel 은 JPABase 를 계승 하 는 것)을 계승 하여 실제 사용 하 는 모델 류 를 계승 하 는 종 류 를 썼 습 니 다.
@MappedSuperclass
public class ModelWithUuid extends GenericModel {
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid.hex")
@Column(columnDefinition="char(32)")
public String id;
public String getId() {
return id;
}
}
프로그램 이 실 행 될 때 이 오류 가 발생 합 니 다.
play.exceptions.UnexpectedException: Model ModelWithUuid is not managed by any plugin
모델 을 계승 하 는 클래스 마다 사용 된다 면 Fixtures.deleteAllModels()로 표 데 이 터 를 직접 삭제 하거나 Fixtures.delete(User.class)와 같은 방법 으로 표 데 이 터 를 자동 으로 삭제 할 클래스 를 적 을 수 있 습 니 다.
@OnApplicationStart
public class Bootstrap extends Job {
@Override
public void doJob() {
Fixtures.delete(User.class);
Fixtures.delete(Admin.class);
Fixtures.delete(Menu.class);
Fixtures.load("data.yml");
}
}
Fixtures.deleteAll()조심 하 세 요!