【发布时间】:2013-04-24 10:54:04
【问题描述】:
摘要
说,我有两个简单的@Entity 继承树(一个抽象基类,每棵树中有两个具体实现类)InheritanceType.TABLE_PER_CLASS;我需要使用@JoinColumn 连接基类的双向@OneToMany 关系。
这应该产生 四个 表,每个具体类一个,对吧? EclipseLink 为其中一个抽象基类生成了第五个表,这对我来说没有意义。考虑这个例子(这不是一个真实的例子;它只是关于 JPA):
示例
集合是第一个继承树的抽象根和@OneToMany 关系的实现者:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Collection {
@Id @GeneratedValue
public long id;
@OneToMany(mappedBy="collection")
public List<Media> items = new ArrayList<Media>();
}
PhysicalCollection 和 VirtualCollection 是 Collection 的具体实现:
@Entity
public class PhysicalCollection extends Collection {}
@Entity
public class VirtualCollection extends Collection {}
Media 是第二个继承树的抽象根和@ManyToOne 关系的实现者:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Media {
@Id
@GeneratedValue
public long id;
@ManyToOne
@JoinColumn(nullable = false)
public Collection collection;
}
CdMedia 和 TapeMedia 是 Media 的具体实现:
@Entity
public class CdMedia extends Media {}
@Entity
public class TapeMedia extends Media {}
结果
正如我所说,EclipseLink 将由此生成 五个 表(不要介意 SEQUENCE 表):
mysql> SHOW TABLES;
+--------------------+
| Tables_in_test |
+--------------------+
| CDMEDIA |
| MEDIA |
| PHYSICALCOLLECTION |
| SEQUENCE |
| TAPEMEDIA |
| VIRTUALCOLLECTION |
+--------------------+
6 rows in set (0.00 sec)
而且意外的表MEDIA会有一个无用的定义(重命名PhysicalCollection时外键目标改变语义):
CREATE TABLE `MEDIA` (
`COLLECTION_ID` bigint(20) NOT NULL,
KEY `FK_MEDIA_COLLECTION_ID` (`COLLECTION_ID`),
CONSTRAINT `FK_MEDIA_COLLECTION_ID` FOREIGN KEY (`COLLECTION_ID`) REFERENCES PHYSICALCOLLECTION` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
问题
- 我的预期正确吗? (创建 4 个表,而不是 5 个)
- 有人可以确认这是 EclipseLink 中的错误吗?
- 如果不是错误,您能指出我哪里出错了吗?
【问题讨论】:
-
我有一个类似的模型和同样的问题。你设法解决了吗?
标签: jpa eclipselink one-to-many table-per-class