代码之家  ›  专栏  ›  技术社区  ›  Damian Leszczyński - Vash

休眠不同类型的pojo映射

  •  0
  • Damian Leszczyński - Vash  · 技术社区  · 16 年前

    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
    

    主要的是,我们需要在TargetSolution中有一个targetPojo,它是一个类的类型,而这个类没有映射(我们需要到实体的更多信息,并且没有选择使用多对多关系来实现这一点,在这种情况下,所有数据必须存储在一个表中),这是应用于鉴别器的类型的实例。

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

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

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

    有什么建议吗?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Bozho    16 年前

    这是一个典型的场景 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>
    
        2
  •  1
  •   luisky    13 年前