【发布时间】:2014-04-26 14:19:17
【问题描述】:
我在自动更新外键时遇到问题,如下所示:
我有两个表 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;
}
现在我的问题。我尝试使用 1 个新的相关 HamKeywordAlias 向 HamKeyword 添加一个新条目:
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 表中的实体,但在字段 keywordid 中具有 NULL。
我还测试了手动将行添加到 HamKeywordAlias 表中。检索 HamKeyword 表的条目并使用以下代码检索相关别名非常有效:
HamKeywords hamCurrentKeyword = (HamKeywords) session.get(HamKeywords.class, (long)1);
hamCurrentKeyword.getHamKeywordsAliases();
因此,我假设我正确定义了多对一关系。但是,外键不会自动更新。 你能帮助我为什么不这样做吗?
谢谢
菲利克斯
【问题讨论】:
标签: java sql hibernate foreign-keys