【问题标题】:No discriminator column in JOINED inheritance strategyJOINED 继承策略中没有鉴别器列
【发布时间】:2019-02-17 09:35:32
【问题描述】:

编辑 - 这已解决:ProJPA2 声明一些持久性提供程序实现了一个没有鉴别器列的 JOINED 策略。感谢那些为我的问题留下答案的人。


我有一个使用 JOINED 继承策略的简单设置,但我很困惑为什么,与我在网上和 ProJPA2 中阅读的关于加入策略的内容相反,我生成的没有鉴别器列DDL。

有趣的是,SO上有这个问题: Why EclipseLink is adding discriminator column for joined inheritance strategy?

问,为什么 eclipselink 在(在 OP 看来)没有必要时添加一个鉴别器列。 我的小测试工作正常,数据正确保存,一切正常,这似乎证明了提问者的观点,但是,我的任何表中都没有鉴别器列。我只是从每个子(子类)表到父(超类)表的 FK。

为了简单起见,我使用的是 eclipse、eclipselink 2.5.x、mysql,它是一个 Java SE JPA 环境。我在某处使用休眠,因为我正在记录大量休眠内容,例如

 17:44:14 INFO  [org.hibernate.Version].logVersion - HHH000412: Hibernate Core {5.2.17.Final}

但我不记得此设置在项目中的位置,我现在需要离开。

感谢所有见解。谢谢。

代码sn-ps:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)
public class Order {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private int id;
    private String name;
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;
...
}



@Entity
public abstract class ShoppingOrder extends Order {
    private String shopName;
   ...
}


@Entity
public class SuperMarketShoppingOrder extends ShoppingOrder {

private String supermarketName;
...
}


@Entity
public class EuroSuperMarketShoppingOrder extends SuperMarketShoppingOrder {
    private String country;
...
}

生成的 DDL:

CREATE TABLE `shoppingorder` (
  `id` int(11) NOT NULL,
  `date` datetime(6) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `shopName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `supermarketshoppingorder` (
  `supermarketName` varchar(255) DEFAULT NULL,
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `FKg6ui4gndl8m9ouut2sb1g8xmm` FOREIGN KEY (`id`) REFERENCES `shoppingorder` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `eurosupermarketshoppingorder` (
  `country` varchar(255) DEFAULT NULL,
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `FK2g6xgprpajjl3msv9rm00gi1f` FOREIGN KEY (`id`) REFERENCES `supermarketshoppingorder` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

【问题讨论】:

  • 如果它是 JOINED ,那么它会加入以确定一行代表哪个类/子类(因此不需要鉴别器)。当一个表包含多个类的数据时,您只需要一个鉴别器(例如 SINGLE_TABLE 策略)。而且你不能同时使用 Hibernate 和 EclipseLink,所以先弄清楚你在使用什么......
  • “因此不需要鉴别器”是的,我同意。顺便说一句,关于使用 Hibernate 和 EclipseLink - 我刚刚打开项目并记得它在 POM 中指定了休眠:依赖项是休眠依赖项;同时eclipse中的JPA方面使用eclipselink。

标签: hibernate jpa eclipselink jpa-2.0


【解决方案1】:

您的映射不正确。

你有

@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)

MappedSuperclass 用于在子类中包含来自超类的所有字段,而 Inheritance 是“真正的”继承映射。

所以你应该删除@MappedSuperclass。

但这不是你的问题。

您是否创建了在超类级别和子类级别进行查询的查询?

这也有效吗?

我可以假设它不会起作用。

EclipseLink 正在使用鉴别器列来区分子类是哪种类型。 Hibernate 对 case 语句也是如此。

请告诉我查询是否有效。谢谢。

【讨论】:

  • 您好,感谢您的建议,但@MappedSuperclass@Inheritance 的用途不同; @MappedSuperclass 定义了一个不可持久的超类,子类实体从中继承字段和映射,而@Inheritance 允许指定继承策略。我刚刚尝试不使用@MappedSuperclass,但正如我所料,我遇到了一个异常,因为我现在有一个类(Order),其映射没有@Entity 注释;它没有 @Entity 注释,因为它旨在成为映射的超类 - 它不应该有自己的表。
  • 例外是Exception in thread "main" java.lang.ExceptionInInitializerError Caused by: org.hibernate.AnnotationException: No identifier specified for entity: x.y.jpa.entity.ShoppingOrder
  • 是的,我有可以多态工作的查询(或查询):static TypedQuery<ShoppingOrder> shoppingOrdersQuery = em.createQuery("SELECT o FROM ShoppingOrder o", ShoppingOrder.class);
【解决方案2】:

我刚刚在我的 ProJPA2 书中看到了这一点,它澄清了这个问题 - 很抱歉我之前没有注意到它:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2013-12-04
    • 2011-04-08
    • 2014-04-19
    • 2014-04-20
    • 1970-01-01
    相关资源
    最近更新 更多