Hibernate - 如何在jUnit中测试序列映射和策略

时间:2014-08-27 21:50:26

标签: java spring hibernate jpa junit

从Hibernate测试@SequenceGenerator的方法是什么?我想确保每个序列都完美映射,拼写没有错误,并且递增由1完成。有没有办法动态地为所有序列执行此操作?

以下是我的序列映射示例:

@Column(name = "ADDRESS_ID", nullable = false, precision = 20)
@Id
@SequenceGenerator(name = "AddressSeq", sequenceName = "ADDRESS_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AddressSeq")
private Long addressId;

1 个答案:

答案 0 :(得分:1)

您可以使用this answer来获取实体类的列表:

    List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
    classLoadersList.add(ClasspathHelper.contextClassLoader());
    classLoadersList.add(ClasspathHelper.staticClassLoader());

    reflections = new Reflections(
            new ConfigurationBuilder()
                    .setScanners(new SubTypesScanner(false),
                            new ResourcesScanner())
                    .setUrls(
                            ClasspathHelper.forClassLoader(classLoadersList
                                    .toArray(new ClassLoader[0])))
                    .filterInputsBy(
                            new FilterBuilder().include(FilterBuilder
                                    .prefix("me.business.model"))));

用你的DDL获取:

    ClassPathResource cpr = new ClassPathResource("db/schema.sql");
    schemaContent = new String(FileCopyUtils.copyToByteArray(cpr
            .getInputStream())).toLowerCase();

获取每个班级的序列;

private String getSequenceName(Class<?> clazz) {
    for (Field f : clazz.getDeclaredFields()) {
        if (f.isAnnotationPresent(SequenceGenerator.class)) {
            SequenceGenerator sg = f.getAnnotation(SequenceGenerator.class);
            return sg.sequenceName();
        }
    }
    return null;
}

测试很简单:

    Set<Class<?>> entities = reflections.getSubTypesOf(Object.class);
    for (Class<?> clazz : entities) {
        String name = getSequenceName(clazz);
        if (name == null)
            continue;
        if (!schemaContent.contains(name.toLowerCase())) {
            fail("The clazz " + clazz.getSimpleName()
                    + " has a sequence called: " + name
                    + " and it doesn't exits");
        }
    }

你可以看到它here

如果您想查看它是否有效,请更改其中一个权限中的序列名称并运行测试。