JPA - InheritanceType.Joined создает неправильные таблицы - PullRequest
1 голос
/ 23 октября 2011

Я пытаюсь представить в базе данных редактируемую таблицу с несколькими типами полей. Мой подход выглядит так:

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" это.

1 Ответ

2 голосов
/ 23 октября 2011

Аннотация @Id в поле parent в Value должна быть заменена на @MapsId.

Но вы бы действительно сделали себе одолжение, имея технический, нефункциональный, автоматически сгенерированный идентификатор в Value, и пусть поля row, col и parent будут регулярными полями сущности , Это определенно сделает работу более производительной и намного проще в использовании во всех частях приложения.

...