Java Hibernate:与多键表的键之一连接
我有一个表格类别和一个表格可翻译文本。类别是这样的Java Hibernate:与多键表的键之一连接,java,hibernate,orm,hibernate-onetomany,Java,Hibernate,Orm,Hibernate Onetomany,我有一个表格类别和一个表格可翻译文本。类别是这样的 create table Category ( id int not null, parent_id int default 0, TranslatableDescriptionId int default 1, primary key(id)); create table TranslatableText ( id int not null, lang enum ('NO','EN','FR'), text me
create table Category (
id int not null,
parent_id int default 0,
TranslatableDescriptionId int default 1,
primary key(id));
create table TranslatableText (
id int not null,
lang enum ('NO','EN','FR'),
text mediumtext,
primary key(id, lang));
在我的类别实体中,我定义了一个映射:
@Fetch(FetchMode.SUBSELECT)
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
@OneToMany(fetch=FetchType.LAZY)
@JoinColumn(name="TranslatableDescriptionId")
@ForeignKey(name="FK_TranslatableTextId")
private Set<TranslatableText> translatableText;
选择了名称不正确的查询:
选择translateAB0.translateableDescriptionId为translate4\u 13\u 1\u,translateAB0.id为id1\u,translateAB0.lang为Lang1\u,translateAB0.id为id22\u 0\u,translateAB0.lang为Lang22\u 0\u,translateAB0\u。文本为Text22\u 0\u来自TBLTTranslateableText TranslateAB0,其中translateAB0.translateableDescriptionId位于(‘126’、‘119’、‘103’、‘116’、‘121’、‘107’、‘113’、‘101’、‘109’、‘105’、‘123’、‘106’、‘125’、‘124’、‘114’)
如果我将映射@JoinColumn更改为
@JoinColumn(name="TranslatableDescriptionId", referencedColumnName="id")
加载我的应用程序时出现以下错误:
org.hibernate.MappingException:在org.hibernate.mapping.Table(类别)及其相关的超级表和辅助表中找不到逻辑名称为id的列
为了更好地衡量,我还尝试了:
@JoinColumn(name="id", referencedColumnName="TranslatableDescriptionId")
这给了我一个错误:
org.hibernate.MappingException:在org.hibernate.mapping.Table(Category)及其相关的超表和辅助表中找不到逻辑名称为translateableDescriptionId的列
对我应该做什么有什么建议吗?我真的希望Category的translateableText包含其描述的所有翻译,所以我真的想加入Category.TranslateableDescriptionId==translateableText.id
更新1:
可翻译文本被许多实体使用,因此在其中放入categoryId并反转关系不是一个选项
更新2:
我可以通过@JoinColumn(name=“id”)
加载它,但这导致了Hibernate中的ClassCastException,它没有使用整数作为键,而是使用包含单个整数作为键的数组。这无法生成字符串,因此无法生成正确的SQL。因此,它可能仍然不是我想要的映射
干杯
Nik这种映射是可能的,但不是很方便,因为您必须手动管理
translateabletext
的标识(这就是为什么Hibernate抱怨未映射列translateableDescriptionID
):
-
感谢您的建议,我将立即尝试该设计并报告:-)然而,我有点困惑,因为我阅读它的方式只是将问题推到我面前的一步?“name=“targetId””在类别中指向Category.targetId,对吗?或者应该是“name=”id“,因为它指向TranslationTargets.id,就像TranslationTarget的“name=”targetId“指向TranslatableText.targetId一样?执行此操作时,我会遇到以下异常。映射中有什么我遗漏的吗?com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:field list@niklasaers:
@manytone
中的@JoinColumn
中的未知列“texts0.targetId”指向“many”侧外键的名称(即translateable text.targetId
),然后在@OneToOne
中,它指向当前端,即类别。targetId
@niklassaers:注意,我将可翻译文本的id
重命名为targetId
。
@JoinColumn(name="id", referencedColumnName="TranslatableDescriptionId")
public class Category implements Serializable {
...
private Long translatableDescriptionId;
@OneToMany
@JoinColumn(name="id", referencedColumnName="TranslatableDescriptionId")
private Set<TranslatableText> translatableText;
...
}
public class Category {
...
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "targetId")
private TranslationTarget target;
}
public class TranslationTarget {
@Id @GeneratedValue
private Long id;
@OneToMany
@JoinColumn(name = "targetId")
private Set<TranslatableText> texts;
}
create table Category (
targetId int,
...);
create table TranslationTargets (
id int primary key
);
create table TranslatableText (
targetId int not null,
lang enum ('NO','EN','FR'),
text mediumtext,
primary key(targetId, lang));