Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:与多键表的键之一连接_Java_Hibernate_Orm_Hibernate Onetomany - Fatal编程技术网

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));