【问题标题】:Java hibernate: Update foreign key in manytoone relationship automaticallyJava hibernate:自动更新多对一关系中的外键
【发布时间】: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


    【解决方案1】:

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

    hka.setHamKeywords(hkw);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多