Java hibernate:自动更新多人关系中的外键

时间:2014-04-26 14:19:17

标签: java sql hibernate foreign-keys

我的外键自动更新出现问题,如下所示:

我有两张桌子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();

因此,我假设我正确地定义了多对一关系。但是,外键不会自动更新。 你可以帮助我为什么不这样做?

由于

菲利克斯

1 个答案:

答案 0 :(得分:0)

您拥有双向OneToMany关联。该协会的所有者是多方:HamKeywordsAlias.hamKeywords。这是Hibernate关心的一面。但是你没有初始化它。您为关键字添加了别名&#39;别名集合,但未能设置别名的关键字:

hka.setHamKeywords(hkw);