当前位置: 首页 > 面试题库 >

如何使用Hibernate / JPA注释覆盖GenerationType策略?

魏波娃
2023-03-14
问题内容

我正在考虑使用注释来定义我的Hibernate映射,但是遇到了一个问题:我想使用基础实体类来定义公共字段(包括ID字段),但是我希望不同的表具有不同的ID生成策略:

@MappedSuperclass
public abstract class Base implements Serializable {
    @Id
    @Column(name="ID", nullable = false)
    private Integer id;
    public Integer getId(){return id;}
    public void setId(Integer id){this.id = id;}
    ...
}

@Entity
@Table(name="TABLE_A")
public class TableA extends Base {
    // Table_A wants to set an application-defined value for ID
    ...
}

@Entity
@Table(name="TABLE_B")
public class TableB extends Base {
    // How do I specify @GeneratedValue(strategy = AUTO) for ID here?
    ...
}

有什么办法可以做到这一点?我曾尝试将以下内容包含TableB进来,但hibernate状态是我两次反对同一栏,这似乎是错误的:

@Override // So that we can set Generated strategy
@Id
@GeneratedValue(strategy = AUTO)
public Integer getId() {
    return super.getId();
}

问题答案:

在上面的代码中,您似乎在混合字段(超类)和方法(子类)的注释。Hibernate
参考文档建议避免这种情况,我怀疑这可能是导致问题的原因。根据我在Hibernate中的经验,无论如何,注释getter /
setter方法而不是字段都是更安全,更灵活的方法,因此,我建议您尽量使用该设计。

为了解决您的问题,建议您从Base超类中完全删除 id 字段。而是将该字段移到子类中,并在Base类中创建抽象getId()
setId() 方法。然后在子类中重写/实现 getId()setId() 方法,并使用所需的生成策略对getter进行注释。

希望这可以帮助。



 类似资料:
  • 我们正在使用Hibernate生成销售报告。 脚本 当用户在输入一些条件后点击生成报告按钮时,我正在使用Hibernate状态从数据库中获取数据,然后我们正在进行一些数据操作以生成实际的报告数据。报告数据存储在ArrayList中,然后保存到与Hibernate实体映射的数据库中,如下图所示 CommusionSummary。JAVA 每个月都会生成报告。我的问题是:2012年7月5日,用户已经生

  • 我正在使用Hibernate注释,我试图解决的问题如下: 我需要有2个不同的@Entity类具有相同的列映射,但具有不同的标识符。 第一个应该使用id作为标识符。 第二个应使用名称作为标识符。 因此,我有一个抽象类,用@MappedSuperclass进行注释,这些@MappedSuperclass具有包括id和name在内的所有列,此外还有2个@Entity类,这些类扩展了超类并覆盖了id和na

  • 问题内容: 根据 Hibernate参考文档 ,使用Hibernate的XML元数据时应该可以混合使用不同的继承映射策略:http : //docs.jboss.org/hibernate/stable/core/reference/en/html/inheritance.html#inheritance -mixing-tableperclass- tablepersubclass 但是,《 H

  • 问题内容: 标题不言自明。 我很高兴听到解决方案,谢谢。 问题答案: 到目前为止,有一种比列出的方法更短的方法:

  • 问题内容: 有一个结构。我想以这种方式链接这三个实体:公司应包含ID,公司名称和部门列表,每个部门都有一个工人列表,ID和部门名称。每个工人都有名字,身份证。 我试图与一对多和多对一建立联系,但未成功。 公司 部 工人 我从开始: 它填充公司,但不填充其他表,也没有创建任何联接(映射)错误: 问题答案: 除了Glenn Lane的答案中提到的级联,您还需要了解双向关联是如何工作的。 它们有一个所有

  • 我有一张从班级媒体继承的班级CD: 光盘: 媒体: JPA 自动生成一个外键名称,我想用我想要的名称覆盖它: 03-10 18:16:58.174[main]调试org.hibernate。SQL-alter table cd添加约束FK_ehd468g2cptgh6bq6sxe75xlf外键(id)引用媒体(id) 怎么做?我试过: 和 但它不起作用。 下面是 sql 生成的创建表: 我想: