【问题标题】:Annotations for Hibernate lookup table/type?Hibernate 查找表/类型的注释?
【发布时间】:2013-09-13 07:27:05
【问题描述】:

我正在尝试使用 Hibernate,并将 hbm2ddl.auto 设置为 validate,以便 Hibernate 必须尊重我的数据库架构,而不是围绕我的 Java 类自动生成表。

我的很多表都是所谓的“查找”或“参考”表,它们基本上由idnametag 字段组成:

credit_card_types
    credit_card_type_id           Ex: "12"
    credit_card_type_name         Ex: "Visa"
    credit_card_type_tag          Ex: "VISA"

payment_types
    payment_type_id               Ex: "2"
    payment_type_name             Ex: "Google Checkout"
    payment_type_tag              EX: "GOOGLE_CHECKOUT"

etc.

我想将这些建模如下:

public class BaseLookup {
    private Long id;
    private String name;
    private String tag;

    // ...getters, setters and ctors, etc.
}

public class CreditCardTypes extends BaseLookup {
    // .. perhaps a few other fields, methods, etc...
}

public class PaymentTypes extends BaseLookup {
    // .. perhaps a few other fields, methods, etc...
}

问题是我不希望 Hibernate 搜索(验证)lookups 表:我希望它验证分别称为 credit_card_typespayment_types 的 2 个查找表。

我需要哪些注解/配置才能允许这种类型的 Java 继承但只创建 2 个查找表(而不是 3 个)?提前致谢!

【问题讨论】:

  • 我认为您可以使用 hbm.xml 但不使用注释来做到这一点。在 Hbm.xml 的情况下,您可以像只有一个实体一样行事,并将 CreditCardTypes 和 PaymentTypes 像实体一样映射到单个类中

标签: java hibernate inheritance orm lookup-tables


【解决方案1】:

为您的基类添加以下注释:

@MappedSuperclass
public class BaseLookup implements Serializable {

    @Id
    @Column (name="ID")
    private Long id;

    @Column (name="NAME")
    private String name;

    @Column
    private String tag;

    // ...getters, setters and ctors, etc.
}

对于您的孩子的课程,您将执行以下操作:

@Table(name = "CREDITCARDTYPES")
public class CreditCardTypes extends BaseLookup {
   // .. perhaps a few other fields, methods, etc...

   @Coulmn (name="FIELD1_COLUMN_NAME")
   private String field1;
}

你可以用同样的方式做第二节课:

@Table(name = "PAYMENTTYPES")
public class PaymentTypes extends BaseLookup {
   // .. perhaps a few other fields, methods, etc...

   @Coulmn (name="FIELD2_COLUMN_NAME")
   private String field2;
}

【讨论】:

  • 谢谢@fujy (+1) - 但是我如何指定PaymentTypes#id 映射到名为payment_type_id 的字段,而CreditCardTypes#id 映射到名为@ 的字段987654327@?
  • 两个表都有一个名为id的主键,如果我理解正确,您想为每个表设置一个唯一的主键名称,对吧?
  • 几乎@fujy,但不完全-我希望我的credit_card_types 表有一个名为credit_card_type_id 的主键,我的payment_types 表有一个名为payment_type_id 的主键.
  • 只需移动子类上的Id字段,并在答案中添加您想要的列名称作为示例
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
相关资源
最近更新 更多