如何访问JPA中的鉴别器列

时间:2017-04-23 11:59:33

标签: java sqlite jpa discriminator joined-subclass

DisseminationArea作为Feature的子标记,代码如下:

@Entity
@Table(name = "features")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "subtype_id", discriminatorType = DiscriminatorType.INTEGER)
public class Feature {

   @Id
   @Column(name="id")
   @GeneratedValue(generator="sqlite")
   @TableGenerator(name="sqlite", table="sqlite_sequence",
      pkColumnName="name", valueColumnName="seq",
      pkColumnValue="features")
   @Getter
   @Setter
   private long id;

   @ManyToOne
   @JoinColumn(name = "subtype_id")
   @Getter
   @Setter
   private FeatureSubtype featureSubtype;

   @ManyToOne
   @JoinColumn(name = "parent_id")
   @Getter
   @Setter
   private Feature parent;

   ...    
}

不幸的是,这会在将此实体保存到数据库时导致异常,因为subtype_id字段被使用了两次。

我能否以某种方式对其进行注释,以便JPA知道它是同一个字段?

3 个答案:

答案 0 :(得分:4)

如果InheritanceType.JOINED的鉴别器列有意义值得讨论。我倾向于在加入策略中省略它,并且仅将其与InheritanceType.SINGLE_TABLE一起使用。

尽管如此,可以映射它而不会出现重复的列错误。

如果您的超类实体具有继承/鉴别器定义,如:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "subtype_id", discriminatorType = DiscriminatorType.INTEGER)

您只需通过将其设置为readonly来调整映射以不像往常一样更新值:

@Column(name="subtype_id", insertable = false, updatable = false)
protected int subTypeId;

public int getSubTypeId() {
    return subTypeId;
}

现在您可以访问实体的鉴别器值。

答案 1 :(得分:0)

相同的列名用于FK与FeatureSubtype的关系。 使用其他名称作为鉴别者或根本不使用鉴别​​器。

在Hibernate中,支持连接继承的discriminator列,但不需要。 Hibernate正在查询所有子表以确定正确的子类。

答案 2 :(得分:0)

或者使用例如:

th:text="${OBJECTNAME.class.getSimpleName()}"

这很简单,使用 @DiscriminatorColumn...