Я знаю, что это старый, но тем не менее действительный. Я столкнулся с той же проблемой. Однако @MappedSuperClass не совпадает с таблицей одиночного наследования. MappedSuperClass создаст отдельные таблицы для каждого из подклассов (насколько я понимаю)
Я точно не знаю, почему, но когда у меня был только один унаследованный класс, у меня не было проблем. Однако, как только я добавил второе и третье, я получил ту же ошибку. Когда я указал аннотацию @Id в дочерней таблице, она снова заработала.
Мой макет был прост, контактная информация для компаний, агентов и клиентов.
Родительская таблица:
...
@Entity
@Inheritance(strategy= InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="USER_TYPE", length=10, discriminatorType= DiscriminatorType.STRING)
@Table(name="CONTACTS")
public abstract class AbstractContact implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column (length=10, nullable=false)
protected String mapType;
@Column (length=120, nullable=false)
protected String mapValue;
...
Контакты агента
@Entity
@DiscriminatorValue("Agent")
public class AgentContact extends AbstractContact implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="USER_ID")
protected Agents agent;
}
Контакт с компанией:
@Entity
@DiscriminatorValue("Company")
public class CompanyContact extends AbstractContact implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="USER_ID")
protected Companies company;
}
Контакты клиента:
@Entity
@DiscriminatorValue("Client")
public class ClientContact extends AbstractContact implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
//Client table not built yet so... no mapping
}
Таблица клиентов еще не построена, поэтому нет информации о сопоставлении, но вы поняли.
Я хотел бы поделиться описанием MySQL, но командная строка Windows слишком бесполезна для вырезания / копирования / вставки! По сути, это:
ID (int pri)
USER_TYPE (VARCHAR (10))
USER_ID (INT)
MAPTYPE (VARCHAR (10))
MAPVALUE (VARCHAR (120))
Мне все еще нужно настроить все тесты, но пока все выглядит хорошо (я боюсь, что если я подожду, пока я выполню все тесты, я забуду опубликовать это)