Oracle Berkeley DB Java Edition - вторичный ключ уникальности

У меня есть простой класс сущностей, и он должен включать в себя уникальные имена.

@Entity
class Package {
    @PrimaryKey(sequence = "ID")
    public Long id;

    @SecondaryKey(relate = Relationship.ONE_TO_ONE)
    public String name;

    private Package() {}

    public Package(String name) { this.name = name; }

    @Override
    public String toString() { return id + " : " + name; }
}

Я хочу использовать опцию отложенной записи из-за обширной модификации. Вот тест, который я попробовал, и его вывод.

final String dbfilename = "test01";
new File(dbfilename).mkdirs();
EnvironmentConfig config = new EnvironmentConfig().setAllowCreate(true);
Environment environment = new Environment(new File(dbfilename), config);
StoreConfig storeConfig = new StoreConfig().setAllowCreate(true).setDeferredWrite(true);
EntityStore store = new EntityStore(environment, "", storeConfig);

PrimaryIndex<Long, Package> primaryIndex = store.getPrimaryIndex(Long.class, Package.class);

try {
    primaryIndex.put(new Package("package01")); // will be put.
    primaryIndex.put(new Package("package01")); // throws exception.
} catch (UniqueConstraintException ex) {
    System.out.println(ex.getMessage());
}

store.sync(); // flush them all

// expecting to find one element
SortedMap<Long,Package> sortedMap = primaryIndex.sortedMap();
for (Package entity : sortedMap.values()) {
    System.out.println(entity);
} 

Выход

(JE 5.0.73) Unique secondary key is already present
1 : package01
2 : package01

Поэтому мой вопрос заключается в том, что даже если он выдает исключение при установке второго пакета, почему он перечисляет два пакета. Есть ли способ избежать этого без использования транзакций?

Благодарю.

0 ответов

Другие вопросы по тегам