play framework Fixture.deleteAll()

2615 단어 Sybase
최근 에는 play framework 를 사용 하여 웹 사 이 트 를 개발 하려 고 시도 하고 있 습 니 다.개발 모델 은 정말 좋 습 니 다.클래스 를 수정 한 후 자동 으로 불 러 옵 니 다.재 부팅 이 필요 없고 자동 재 구축 표 와 테스트 데 이 터 를 삽입 할 수 있 습 니 다.하지만 아름 다운 것 도 함정 이 있 습 니 다.
 
클래스 를 수정 하고 프로그램 을 시작 할 때마다 예 정 된 테스트 데이터 만 사용 하기 위해 서 저 는 클래스 를 썼 습 니 다.프로그램 이 시 작 될 때 표 데 이 터 를 지우 고 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()조심 하 세 요!

좋은 웹페이지 즐겨찾기