несколько ManyToOne в JPA: обновление / создание ссылок - PullRequest
0 голосов
/ 14 апреля 2011

(я новичок в JPA) У меня есть 3 объекта JPA: пользователь, настройка и настройка пользователя.
Отношения: ManyToOne между UserSetting, User; ManyToOne между UserSetting, Setting.

Цель: при добавлении записи в UserSetting, запись в настройке должна быть добавлена, только если она не существует.

Вопрос: Я попробовал cascade = All в UserSetting on Setting, но это не удалось, если настройка уже существует.

Я могу написать несколько запросов, которые добавляют параметр, если он не существует, а затем добавить набор параметров пользователя без каскадирования в таблицу параметров. Но это не звучит разумно. Каков приемлемый способ сделать это в JPA?

Вот код сущности:

    @Entity
    @Table(name = "USERS", uniqueConstraints = @UniqueConstraint(columnNames = "USER_ID"))
    @SequenceGenerator(name = "UserSeq", sequenceName = "USER_SEQ")
    public class UserEntity {
        private long id;
        private Set<UserSettingEntity> settings;

        public UserEntity() {
        }

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO, generator = "UserSeq")
        @Column(name = "ID")
        public long getId() {
            return id;
        }

        public void setId(long id) {
            this.id = id;
        }

        @Column(name = "SETTING")
        @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
        public Set<UserSettingEntity> getSettings() {
            if (settings == null) {
                settings = new HashSet<UserSettingEntity>();
            }
            return settings;
        }
    }


    @Entity
    @Table(name = "USER_SETTINGS", uniqueConstraints = @UniqueConstraint(columnNames = {"USER_ID", "SETTING_ID"}))
    @SequenceGenerator(name = "UserSettingSeq", sequenceName = "USER_SETTING_SEQ")
    public class UserSettingEntity {

        private Long id;
        private UserEntity user;
        private SettingEntity setting;
        private String value;

        public UserSettingEntity() {
        }

        public UserSettingEntity(UserEntity user, SettingEntity setting, String value) {
            this.user = user;
            this.setting = setting;
            this.value = value;
        }

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO, generator = "UserSettingSeq")
        @Column(name = "ID")
        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        @ManyToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "USER_ID", nullable = false)
        public UserConfigEntity getUser() {
            return user;
        }

        public void setUser(UserConfigEntity user) {
            this.user = user;
        }
        //if setting exists in database, dont try to add it again
        @ManyToOne(cascade = CascadeType.REFRESH)
        @JoinColumn(name = "SETTING_ID", nullable = false)
        public SettingEntity getSetting() {
            return setting;
        }
    public void setSetting(SettingEntity setting) {
        this.setting = setting;
    }
  @Column(name = "VALUE")
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

@Entity
@Table(name = "SETTING", uniqueConstraints = @UniqueConstraint(columnNames = {"CATEGORY", "CONTEXT", "NAME"}))
@SequenceGenerator(name = "SettingEntitySeq", sequenceName = "SETTING_SEQ")
public class SettingEntity {

    private Long id;
    private String name;

...

    public SettingEntity(String category, String name) {
        this.name = name;
    }

    public SettingEntity() {
    }

    @Id
    @Column(name = "SETTING_ID", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SettingEntitySeq")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

}

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

Ответ, который я нашел, состоял в том, чтобы управлять UserSettingEntity через UserEntity: создавать / получать SettingEntities, получать UserEntity, добавлять все его UserSettingEntities в User.settings и сохранять. Это означает, что для n настроек количество запросов = (2 * n + 2)

0 голосов
/ 14 апреля 2011

Чтобы создать постоянный экземпляр UserSetting, вам нужен постоянный экземпляр Setting.Hibernate не может решить, какой экземпляр вам нужен.Вы несете ответственность за поиск экземпляра Setting или создание нового, прежде чем устанавливать его в новом экземпляре UserSetting.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...