Spring Data Neo4J @Indexed(unique = true)不起作用

时间:2012-10-17 06:16:48

标签: spring spring-data-neo4j

我是Neo4J的新手,我有一个简单的问题。

在我的应用程序中有NodeEntity,一个属性(名称)用@Indexed(unique = true)注释,以实现像我在JPA中使用@Column(unique = true)那样的唯一性。

我的问题是,当我持有一个名字已经存在于我的图表中的实体时,无论如何它都能正常工作。 但是我在这里期待某种例外......?! 以下是我的基本代码概述:

@NodeEntity
public abstract class BaseEntity implements Identifiable
{
    @GraphId
    private Long entityId;
    ...
}

public class Role extends BaseEntity
{
    @Indexed(unique = true)
    private String name;
    ...
}

public interface RoleRepository extends GraphRepository<Role>
{
    Role findByName(String name);
}

@Service
public class RoleServiceImpl extends BaseEntityServiceImpl<Role> implements 
{
    private RoleRepository repository;

    @Override
    @Transactional
    public T save(final T entity) {
    return getRepository().save(entity);
    }
}

这是我的考验:

@Test
public void testNameUniqueIndex() {
    final List<Role> roles = Lists.newLinkedList(service.findAll());
    final String existingName = roles.get(0).getName();
    Role newRole = new Role.Builder(existingName).build();
    newRole = service.save(newRole);
}

这就是我希望出错的地方! 如何确保房产的独特性,而无需亲自检查?

P.S。:我正在使用neo4j 1.8.M07,spring-data-neo4j 2.1.0.BUILD-SNAPSHOT和Spring 3.1.2.RELEASE。

2 个答案:

答案 0 :(得分:6)

我走进了同一个陷阱...只要你创建新实体,你就不会看到异常 - 最后一个 save() -action赢得了战斗。

不幸的是,只有在更新现有实体的情况下才会引发 DataIntegrityViolationException

可以在此处找到有关该行为的详细说明: http://static.springsource.org/spring-data/data-graph/snapshot-site/reference/html/#d5e1035

答案 1 :(得分:5)

如果您使用的是SDN 3.2.0+,请使用failOnDuplicate属性:

public class Role extends BaseEntity
{
    @Indexed(unique = true, failOnDuplicate = true)
    private String name;
    ...
}