JOINED继承策略中没有区分符列

时间:2018-09-12 17:10:23

标签: hibernate jpa eclipselink jpa-2.0

编辑-已解决:ProJPA2指出,某些持久性提供程序实现了JOINED策略,而没有区分符列。谢谢那些留下我问题答案的人。


我有一个使用JOINED继承策略的简单设置,但是为什么我与在线和ProJPA2中关于联合策略的读物相反,为什么我生成的内容中没有歧视项,我对此感到困惑DDL。

有趣的是,关于SO的问题是: Cloud Build image.

询问,为什么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}

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

感谢所有见解。谢谢。

代码段:

@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

2 个答案:

答案 0 :(得分:0)

您的映射不正确。

您有

@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)

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

所以您应该删除@MappedSuperclass。

但这不是你的问题。

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

这也可以吗?

我可以假设它不起作用。

EclipseLink使用discriminator列来区分子类是哪种类型。 Hibernate对case语句也是如此。

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

答案 1 :(得分:0)

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

book