Я знаю, что это старое, но, тем не менее, действительное. Я столкнулся с той же проблемой. Однако @MappedSuperClass - это не то же самое, что таблица наследования Single. 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))
Мне все еще нужно настроить все тесты, но пока все выглядит хорошо (боюсь, что если я подожду, пока не сделаю все тесты, я забуду опубликовать это)
person
Alan B. Dee
schedule
28.12.2011