Hibernate不同类型的pojo映射

时间:2010-09-02 11:27:44

标签: java oracle hibernate

我设计的这个结构的映射存在问题

public abstract class A<T> {
 private int discriminator_value = -1;
 private T value;
 //...
}

public class One extends A<String> {

 public One(){
  setDiscriminatorValue(1);
 }
 //...
}

public class Two extends A<BigDecimal> {

 public Two(){
  setDiscriminatorValue(2);
 }
 //...
}

public class Three extends A<Date> {

 public Three(){
  setDiscriminatorValue(3);
 }
 //...
}


public class TheTargetSolution {
  private Long info1;
  private Long info2;
  private Long info3;
  private A targetPojo; 
 //...  
}

表格结构

 THE_TARGET_SOLUTION_TABLE
  - INFO_1   NUMBER(10)
  - INFO_2   NUMBER(10)
  - INFO_3   NUMBER(10)
  - DISCRIM  NUMBER(2)
  - TEXT_A   NVARCHAR2(200 BYTE)
  - NUMBER_A NUMBER(10)
  - DATE_A   DATE

主要的是我们需要在T​​heTargetSolution中拥有作为A类的类型的targetPojo,并且这个类没有映射,(我们需要更多的信息来实体,而且他们没有选择使用多对多的关系来做到这一点在这种情况下,所有数据都必须存储在一个表中,该表是适用于鉴别器的类型的实例。

恢复

当DISCRIM列值为1时,targetPojo的类型应为One

当DISCRIM列值为2时,targetPojo的类型应为Two

当DISCRIM列值为3时,targetPojo应为3的类型

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

这是inheritance的典型场景,具有每个类的层次结构。如果您使用xml,请参阅链接的文档。如果使用注释,请使用

@MappedSuperclass
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DISCRIM", discriminatorType=INTEGER)
public abstract class A {
   // properties here
}

然后

@Entity
@DiscriminatorValue("1")
public class Two extends A<BigDecimal>

答案 1 :(得分:1)

看看这个:https://github.com/candybon/fasttrack 它提供了一个解决方案,将所有的pojo合作到一个表中