【发布时间】: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