добавление статических данных о свойствах при создании объектов - PullRequest
0 голосов
/ 16 ноября 2010

Предположим, у меня есть два типа сущностей: Пользователь и Страна.

Объекты страны никогда не создаются и не являются изменяемыми. Они обозначены кодами стран ISO альфа3, например, "СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ". Они находятся в таблице СТРАНА с идентификатором столбца PK.

У пользователей есть много-к-одному отображение Страны w / cascade = нет. Пользователи находятся в таблице USER со столбцом FK COUNTRY_ID, который ссылается на COUNTRY (ID).

При создании нового пользователя я могу сделать что-то вроде:

User user = new User();
user.setCountry(em.find(Country.class, "USA"));
em.persist(user);

Я полагаю, что это расточительно, поскольку сначала требуется запрос к СТРАНЕ. Итак, я заметил, что я тоже могу сделать это:

Country usa = new Country();
usa.setId("USA");
User user = new User();
user.setCountry(usa);
em.persist(user);

Поскольку cascade = "none", для этого не нужно запрашивать таблицу COUNTRY; он должен просто вставить «США» непосредственно в USER как COUNTRY_ID. Это правильно?

Теперь предположим, что есть какой-то код, который создает пользователей только с COUNTRY_ID = "USA". В таком случае мне пришло в голову сохранить статический экземпляр Country с ID = "USA" и использовать его для каждого нового пользователя? Например:

public class UsaUserFactory implements Factory<User> {

    private static final Country USA = new Country();
    static { USA.setId("USA"); }

    public User newInstance() {
        User user = new User();
        user.setCountry(USA);
        return user;
    }
}

public SomeOtherClass {

    public void persistUser(EntityManager em, Factory<User> uf, ...) {
        User user = uf.newInstance();
        // set some other properties
        em.persist(user);
    }
}

Предположим, что persistUser () вызывается одновременно из нескольких потоков и из нескольких контекстов персистентности.

Мои вопросы:

  1. Будут ли сохраняющиеся пользовательские сущности каким-либо образом изменять мой единственный экземпляр "USA" Country?

  2. Это совершенно нецелесообразно по каким-то другим причинам?

Два класса выше просто иллюстрируют вопрос; На самом деле я не делаю ничего такого глупого.

1 Ответ

1 голос
/ 16 ноября 2010

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

...