在试图在映射的supperclass上下文中坚持对象映射时,休眠 /参考完整性约束违规错误

发布于 2025-02-13 19:08:47 字数 5580 浏览 0 评论 0原文

我有一个超类(用@mappedsuperclass策略注释)和2个持久子类:subclass1和subclass2。 该超类包含类型“嵌入式对象”对象的映射。 The problem is that when I instantiate an entity of type SubClass1 and try to persist it, I get a the following error:

Referential integrity constraint violation: "FKN0P0Y5R3MEM881KR8U3HDHYGS: PUBLIC.EMBEDDEDOBJECTSMAP_TESTOBJECT_MAPPING FOREIGN KEY(EMBEDDEDOBJECTSMAP_SUPERCLASSID ) 参考公共。 subclass2 (superclassid)(1)”; SQL语句: 插入插入到EmbeddedObjectsmap_testobject_mapping中(embeddedobjectsmap_superclassid,embeddedobjectsmap_key,embeddedobject_id)值(?,?,?)[23506-200] [23506-200]

我的理解是,我的理解是通过在联合表中构建相应的行,一个sub sub sub sub sub sub sub sub sub sub sub sub sub sub sub sub subs hiber ybernate for实体(而不是subclass1类型),出于未知原因。

提示:我注意到,如果我在Hibernat.cfg.xml文件中更改实体声明的订单,请按以下方式交换2行:

之前:

<mapping class="fr.blablabla.testpersistingmapinmappedsuperclasscontext.SubClass1" />
<mapping class="fr.blablabla.testpersistingmapinmappedsuperclasscontext.SubClass2" />

...

<mapping class="fr.blablabla.testpersistingmapinmappedsuperclasscontext.SubClass2" />
<mapping class="fr.blablabla.testpersistingmapinmappedsuperclasscontext.SubClass1" />
    

该错误证明是消失的(但是持续存在“ subclass2”实体会失败当然)。

这是我的代码:

超类:

package fr.blablabla.testpersistingmapinmappedsuperclasscontext;
import java.util.HashMap;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.MapKeyColumn;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@MappedSuperclass
public class SuperClass {

    public SuperClass() {
        // TODO Auto-generated constructor stub
    }
    protected Long superClassID;
    
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column(name = "SuperClassID")
    public Long getSuperClassID() {
        return superClassID;
    }

    public void setSuperClassID(final Long superClassID) {
        this.superClassID = superClassID;
    }

    
    private Map<Long, EmbeddedObject> embeddedObjectsMap= new HashMap<Long, EmbeddedObject>();

@OneToMany (cascade = CascadeType.ALL)

        @Fetch(FetchMode.JOIN)
        @JoinTable(
                name = "EmbeddedObjectsMap_TestObject_mapping", 
    
                joinColumns = {@JoinColumn(name = "EmbeddedObjectsMap_SuperClassID", referencedColumnName = "superClassID")},
                inverseJoinColumns = {@JoinColumn(name = "EmbeddedObject_id", referencedColumnName = "embeddedObjectID")})
        @MapKeyColumn
    public Map<Long, EmbeddedObject> getEmbeddedObjectsMap() {
        return (Map<Long, EmbeddedObject>) embeddedObjectsMap;
    }

    public void setEmbeddedObjectsMap(Map<Long, EmbeddedObject> embeddedObjectsMap) {
        this.embeddedObjectsMap=embeddedObjectsMap;
    }
}


2个子类SubClass1和subClass2是相同的:

package fr.blablabla.testpersistingmapinmappedsuperclasscontext;
import javax.persistence.Entity;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity

@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

public class SubClass1 extends SuperClass {

    public SubClass1() {
        // TODO Auto-generated constructor stub
    }

}

嵌入在Hashmap中的对象只是一个标准实体:

package fr.blablabla.testpersistingmapinmappedsuperclasscontext;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class EmbeddedObject {

    public EmbeddedObject() {
        // TODO Auto-generated constructor stub
    }
    
    protected Long embeddedObjectID;
    
    @Id
    @GeneratedValue //(strategy = GenerationType.IDENTITY)
    public Long getEmbeddedObjectID() {
        return embeddedObjectID;
    }

    public void setEmbeddedObjectID(Long embeddedObjectID) {
        this.embeddedObjectID = embeddedObjectID;
    }
}

最后,主类:

package fr.blablabla.testpersistingmapinmappedsuperclasscontext;

import java.util.Map;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class TestPersistingMap {

    public TestPersistingMap() {
        // TODO Auto-generated constructor stub
    }
    public static void main(String[] args) {
        SuperClass type1SubClass= new SubClass1();
        Transaction transaction = null;
        try (Session session = HibernateUtilTest.getSessionFactory().getCurrentSession()) {
        // start a transaction
        transaction = session.beginTransaction();

        EmbeddedObject embeddedObject1 = new EmbeddedObject();  

        Map<Long, EmbeddedObject> map =type1SubClass.getEmbeddedObjectsMap();

        map.put(1L, (EmbeddedObject) embeddedObject1);      
    
        session.saveOrUpdate(type1SubClass);
        // commit transaction
        transaction.commit();
        System.out.println("entity persisted:"+ type1SubClass.toString());
    } catch (Exception e) {
        e.printStackTrace();
        if (transaction != null) {
            transaction.rollback();
        }
      }
          System.out.println("Fin du programme TestpersistingMap");
    }

}

任何帮助!

I have a superclass (annotated with the @MappedSuperclass strategy) and 2 persistable subclasses: SubClass1 and SubClass2.
This superclass contains a map of objects of type "EmbeddedObject".
The problem is that when I instantiate an entity of type SubClass1 and try to persist it, I get a the following error:

Referential integrity constraint violation: "FKN0P0Y5R3MEM881KR8U3HDHYGS: PUBLIC.EMBEDDEDOBJECTSMAP_TESTOBJECT_MAPPING FOREIGN KEY(EMBEDDEDOBJECTSMAP_SUPERCLASSID) REFERENCES PUBLIC.SUBCLASS2(SUPERCLASSID) (1)"; SQL statement:
insert into EmbeddedObjectsMap_TestObject_mapping (EmbeddedObjectsMap_SuperClassID, embeddedObjectsMap_KEY, EmbeddedObject_id) values (?, ?, ?) [23506-200]

My understanding is that, by building the corresponding row in the join table, Hibernate looks for a "SubClass2" type entity (instead of SubClass1 type), for an unknown reason.

Hint: I noticed that, if I change entity declaration's order in the hibernat.cfg.xml file, swapping the 2 lines as follows:

Before:

<mapping class="fr.blablabla.testpersistingmapinmappedsuperclasscontext.SubClass1" />
<mapping class="fr.blablabla.testpersistingmapinmappedsuperclasscontext.SubClass2" />

After:

<mapping class="fr.blablabla.testpersistingmapinmappedsuperclasscontext.SubClass2" />
<mapping class="fr.blablabla.testpersistingmapinmappedsuperclasscontext.SubClass1" />
    

... the error proves to disappear (but persisting a "SubClass2" entity will fail of course).

Here is my code:

The superclass:

package fr.blablabla.testpersistingmapinmappedsuperclasscontext;
import java.util.HashMap;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.MapKeyColumn;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@MappedSuperclass
public class SuperClass {

    public SuperClass() {
        // TODO Auto-generated constructor stub
    }
    protected Long superClassID;
    
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column(name = "SuperClassID")
    public Long getSuperClassID() {
        return superClassID;
    }

    public void setSuperClassID(final Long superClassID) {
        this.superClassID = superClassID;
    }

    
    private Map<Long, EmbeddedObject> embeddedObjectsMap= new HashMap<Long, EmbeddedObject>();

@OneToMany (cascade = CascadeType.ALL)

        @Fetch(FetchMode.JOIN)
        @JoinTable(
                name = "EmbeddedObjectsMap_TestObject_mapping", 
    
                joinColumns = {@JoinColumn(name = "EmbeddedObjectsMap_SuperClassID", referencedColumnName = "superClassID")},
                inverseJoinColumns = {@JoinColumn(name = "EmbeddedObject_id", referencedColumnName = "embeddedObjectID")})
        @MapKeyColumn
    public Map<Long, EmbeddedObject> getEmbeddedObjectsMap() {
        return (Map<Long, EmbeddedObject>) embeddedObjectsMap;
    }

    public void setEmbeddedObjectsMap(Map<Long, EmbeddedObject> embeddedObjectsMap) {
        this.embeddedObjectsMap=embeddedObjectsMap;
    }
}


The 2 subclasses Subclass1 and SubClass2 are identical:

package fr.blablabla.testpersistingmapinmappedsuperclasscontext;
import javax.persistence.Entity;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity

@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

public class SubClass1 extends SuperClass {

    public SubClass1() {
        // TODO Auto-generated constructor stub
    }

}

The object embedded in the hashmap is just a standard entity:

package fr.blablabla.testpersistingmapinmappedsuperclasscontext;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class EmbeddedObject {

    public EmbeddedObject() {
        // TODO Auto-generated constructor stub
    }
    
    protected Long embeddedObjectID;
    
    @Id
    @GeneratedValue //(strategy = GenerationType.IDENTITY)
    public Long getEmbeddedObjectID() {
        return embeddedObjectID;
    }

    public void setEmbeddedObjectID(Long embeddedObjectID) {
        this.embeddedObjectID = embeddedObjectID;
    }
}

And finally, the main class:

package fr.blablabla.testpersistingmapinmappedsuperclasscontext;

import java.util.Map;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class TestPersistingMap {

    public TestPersistingMap() {
        // TODO Auto-generated constructor stub
    }
    public static void main(String[] args) {
        SuperClass type1SubClass= new SubClass1();
        Transaction transaction = null;
        try (Session session = HibernateUtilTest.getSessionFactory().getCurrentSession()) {
        // start a transaction
        transaction = session.beginTransaction();

        EmbeddedObject embeddedObject1 = new EmbeddedObject();  

        Map<Long, EmbeddedObject> map =type1SubClass.getEmbeddedObjectsMap();

        map.put(1L, (EmbeddedObject) embeddedObject1);      
    
        session.saveOrUpdate(type1SubClass);
        // commit transaction
        transaction.commit();
        System.out.println("entity persisted:"+ type1SubClass.toString());
    } catch (Exception e) {
        e.printStackTrace();
        if (transaction != null) {
            transaction.rollback();
        }
      }
          System.out.println("Fin du programme TestpersistingMap");
    }

}

Any help highly appreciated !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文