У меня есть объект, который является супер класс
@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 и спящего режима?