Я пытаюсь представить в базе данных редактируемую таблицу с несколькими типами полей.
Мой подход выглядит так:
TABLES
- uuid //Primary key
- cols
- rows
- name
VALUE
-col //Key element
-row //Key element
-parent //Key element - table to witch the value belongs
-v_type //@DiscriminatorColumn
STRING_VALUE
-col //Key
-row //Key
-parent //Key
-value
Это продолжается для некоторых других типов значений.
Я сопоставил его с помощью eclipselink 2.3 следующим образом:
Table.java
@SuppressWarnings("serial")
@Entity(name="TABLES")
public class Table implements Serializable{
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
long uuid;
String name;
int rows=0,cols=0;
@OneToMany(targetEntity=Value.class,mappedBy="parent",cascade={CascadeType.ALL},orphanRemoval=true)
@OrderBy("row ASC")
List<Value> values;
}
Value.java
@SuppressWarnings("serial")
@Entity
@IdClass(ValueId.class)
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="V_TYPE",length=1,discriminatorType=DiscriminatorType.STRING)
public abstract class Value implements Serializable{
@Id
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="PARENT")
Table parent;
@Id @Column(unique=false)
int row;
@Id @Column(unique=false)
int col;
}
ValueId.java
@SuppressWarnings("serial")
public class ValueId implements Serializable{
int row,col;
long parent;
// Getters setters etc
}
StringValue.java
@SuppressWarnings("serial")
@Entity
@DiscriminatorValue("S")
public class StringValue extends Value {
String value;
}
Но с этой реализацией результирующая таблица STRING_VALUE
отсутствует поле [parent]. Это плохо, потому что я не могу разрешить значение.
Что я сделал не так? ;)
Я не могу "решить Google" это.