簡體   English   中英

Hibernate嘗試將null插入mapkey

[英]Hibernate tries to insert null into mapkey

我有一個使用Map的雙向映射。 當我嘗試將其持久化時,出現錯誤,表明休眠無法將null插入mapkey列。

地圖實體:

@Entity
@Table(name = "map_parent)
public class MapParent {

    private long id;
    private Map<String, Metadata> datamap = new HashMap<String, Metadata>();

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "MY_SEQ_GEN")
    @SequenceGenerator(name = "MY_SEQ_GEN",
            sequenceName = "my_base_sequence",
            allocationSize = 1)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @OneToMany(cascade = CascadeType.ALL)
    @MapKeyColumn(name = "mapKey")
    @JoinColumn(name="datamap_id")    
    public Map<String, Metadata> getDataMap() {
        return dataMap;
    }

    public void setDataMap(Map<String, Metadata> dataMap) {
         this.dataMap = dataMap;
    }
}

價值實體:

@Entity
@Table(name = "my_metadata")
public class Metadata {

    private boolean binary = false;
    private String data;
    private MapParent parent;

    public Metadata() {
         //empty bean constructor
    }

    @Column(name = "binary")
    public boolean isBinary() {
        return binary;
    }

    public void setBinary(boolean binary) {
        this.binary = binary;
    }

    @Column
    public String getData() [
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    @ManyToOne
    @JoinColumn(name = "datamap_id", updatable = false, insertable = false)
    public MapParent getMapParent() {
         return mapParent;
    }

    public void setMapParent(MapParent mapParent) {
        this.mapParent = mapParent;
    }

持久代碼:

public void submit() {
    MapParent parent = new MapParent();
    Metadata metadata1 = new Metadata();
    metadata1.setData("Data 1");
    parent.getDataMap().put("Metadata1", metadata1);
    entityManager.persist(parent);
    entityManager.flush();
}

上面的代碼給出了以下堆棧跟蹤:

org.hibernate.exception.ConstraintViolationException: could not execute statement       
Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("MY_Metadata"."MAPKEY")

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:943)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1075)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3897)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1361)
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:493)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:186) [hibernate-core-4.2.18.Final-redhat-2.jar:4.2.18.Final-redhat-2]
    ... 91 more

解決此錯誤的任何幫助將不勝感激。

找到了一個解決方案-將mapKey添加為元數據中的字段,並將其與該集合保持一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM