JPA спящий режим и наследование Table_Per_class

голоса
0

У меня есть объект, который является супер класс

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = super_class)
public abstract class SuperClass implements Serializable {
    @Transient
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;

    public abstract void initDefaultValues();

    public long getId() {
        return id;
    }

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

}

и некоторые подклассы, которые расширяют суперкласс.

@Entity
@Table(name = Subclass1)
public class Subclass1 extends SuperClass{

    private static final Logger log = LogManager
            .getLogger(Subclass1.class);
    @Transient
    private static final long serialVersionUID = 1L;

    // testcase configuration tab
    private String configurationTabTestServer;


    private String umtsRelease;


}

Остальные классы выглядят одинаково.

Раньше у них SINGLE_TABLE для типа наследования, но мы хотели каждый конкретный класс, чтобы каждый свой стол. Из-за TABLE_PER_CLASS мне пришлось использовать GenerationType.TABLE.

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

@Entity
@Table(name=myother_entity)
class Entity1{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToOne(cascade = CascadeType.ALL)
    private SuperClass superclass;
    //more fields
}

Я использовал абстрактный класс, потому что у меня есть один класс entity1, который может иметь различный тип суперкласса. Мы не хотим создавать различные Entity1 и entity2 и Entity3 и т.д. классы для каждого подкласса. Таким образом, мы создали один класс entity1, который может иметь поле типа SuperClass, что может указывать на любой из подклассов.

В моей программе я создаю много intances entity1, что некоторые из них, которые имеют различный тип суперкласса в качестве значения поля. Каждый может быть типа subclass1 или subclass2 и т.д. На первом мы использовали, чтобы иметь одну единственную таблицу для всех подклассов. Все работало отлично. Но после того, как мы решили разделить наши таблицы, это то, что это происходит. Когда я редактирую любой экземпляр entity1, который имеет уже суперкласс набор поля (используя один из вспомогательных классов), и сохранить его (слияние его), то он создает новый экземпляр моего Подкласса связанный с моим примером entity1, а затем сохраняет его в база данных. Так что у меня сейчас две записи в таблице подкласса. Этого не произошло, когда мы использовали SINGLE_TABLE тип наследования. Это нормальное поведение для JPA и спящего режима?

Задан 03/08/2015 в 15:29
пользователем
На других языках...                            


1 ответов

голоса
0

Пожалуйста, сначала подумайте: DiscriminatorColumn и DiscriminatorValue аннотации являются специфическими для одной таблицы подхода. Таким образом, они не должны использоваться в таблицы в классе отображений.

Теперь давайте перейдем к вопросу:

В отображении таблицы в классе, будет две записи с таким же ID: один из родительской таблицы, другие в дочерней таблице.

Как я понял, в вашем случае, две записи записываются в дочерней таблице, не так ли? Если да, то эта проблема должна быть при загрузке данных entity1 из базы данных. Свойство «суперкласс» должен иметь свой идентификатор набора. Вы можете использовать нетерпеливую или отложенную загрузку для этого. И проверить, если это свойство правильно загружена (в режиме отладки) с правильным набором ID перед сохранением.

Другой способ заключается в отключении «каскад сохраняются / слияния» и сохранить объекты отдельно. Это может обеспечить более высокий уровень безопасности ваших данных.

Вы можете найти более подробную информацию здесь: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

Ответил 03/08/2015 в 16:01
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more