我的外键自动更新出现问题,如下所示:
我有两张桌子HamKeyword和HamKeywordAlias。 hamKeyword中的一个条目在HamKeywordAlias中有0 ... n个条目。此关系反映在HamKeywordAlias表中的外键字段中。两个表都有自己的主键。我使用hibernate eclipse工具的逆向工程来定义这两个表,如下所示:
@Entity
@Table(name = "HAM_KEYWORDS")
public class HamKeywords implements java.io.Serializable {
private long keywordid;
private String keyword;
…
@Id
@GenericGenerator(name="gen",strategy="increment")
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "KEYWORDID", unique = true)
public long getKeywordid() {
return this.keywordid;
}
…
@OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL, mappedBy = "hamKeywords")
public Set<HamKeywordsAlias> getHamKeywordsAliases() {
return this.hamKeywordsAliases;
}
@Entity
@Table(name = "HAM_KEYWORDS_ALIAS", schema = "dbo", catalog = "ham")
public class HamKeywordsAlias implements java.io.Serializable {
@Id
@GenericGenerator(name="gen",strategy="increment")
@GeneratedValue(generator="gen")
@Column(name = "ALIASID", unique = true, nullable = false)
public long getAliasid() {
return this.aliasid;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "KEYWORDID", nullable = false, updatable = false, insertable = true)
public HamKeywords getHamKeywords() {
return this.hamKeywords;
}
现在我的问题。我尝试向HamKeyword添加一个新条目,其中包含一个新的相关HamKeywordAlias:
HamKeywords hkw = new HamKeywords();
HamKeywordsAlias hka = new HamKeywordsAlias();
hka.setAlias("new alias");
hkw.setHamKeywordsAliases(new HashSet<HamKeywordsAlias>());
Set<HamKeywordsAlias> hkaS = hkw.getHamKeywordsAliases();
hkaS.add(hka);
hkw.setHamKeywordsAliases(hkaS);
session.flush();
session.save(hkw);
session.getTransaction().commit();
此代码失败,并显示错误消息:
ERROR: The value NULL can not be inserted in table 'KEYWORDID'-Spalte, 'ham.dbo.HAM_KEYWORDS'. No NULL allowed for INSERT. Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not execute statement
(请注意,我将错误信息翻译成英文,语言可能有点不同)
显然,不更新HamKeywordAlias表的字段KEYWORDID中的外键。我通过删除NOT NULL约束来仔细检查这个。会发生什么,插入到ALIAS表中的enty但在字段keywordid中有一个NULL。
我还测试了将手动行添加到HamKeywordAlias表中。检索HamKeyword表的条目并使用以下代码检索相关的别名非常有效:
HamKeywords hamCurrentKeyword = (HamKeywords) session.get(HamKeywords.class, (long)1);
hamCurrentKeyword.getHamKeywordsAliases();
因此,我假设我正确地定义了多对一关系。但是,外键不会自动更新。 你可以帮助我为什么不这样做?
由于
菲利克斯
答案 0 :(得分:0)
您拥有双向OneToMany关联。该协会的所有者是多方:HamKeywordsAlias.hamKeywords
。这是Hibernate关心的一面。但是你没有初始化它。您为关键字添加了别名&#39;别名集合,但未能设置别名的关键字:
hka.setHamKeywords(hkw);