java - 具有多个映射和相同值类型的 Hibernate 模式生成错误?

标签 java hibernate postgresql jakarta-ee jpa

Hibernate(核心 {4.2.7.SP5-redhat-1},使用方言 PostgreSQL82Dialect)正在生成一个我不理解的模式,并且当我认为它不应该时它会失败。我遇到的异常(exception)是

ERROR: ERROR: null value in column "aggregategroupmap_id" violates not-null constraint
  Detail: Failing row contains (1, 2, BILLPROGRESS, null, null).

这是真的,因为我没有尝试将任何内容插入到另一列中。我认为我不必这样做,因为这些列引用了两个不同的 map 。

这是我的主要 MyClass 类。

import java.io.Serializable;
import java.util.*;

import javax.persistence.*;

@SuppressWarnings("serial")
@Entity public class MyClass implements Serializable {
    @Id @GeneratedValue private Long id;

    @OneToMany(cascade={CascadeType.ALL})
    private Map<String, GroupInfo> aggregateGroupMap; 
    @OneToMany(cascade={CascadeType.ALL})
    private Map<String, GroupInfo> computationGroupMap;

    public MyClass() {
         aggregateGroupMap = new TreeMap<String, GroupInfo>(); 
         computationGroupMap = new TreeMap<String, GroupInfo>();
    }

    public Map<String, GroupInfo> getAggregateGroupMap() {
         return aggregateGroupMap;
    }
    public Map<String, GroupInfo> getComputationGroupMap() {
         return computationGroupMap;
    }

}

这是第二个类,由第一个类引用。

import java.io.Serializable;
import java.util.*;

import javax.persistence.*;

@SuppressWarnings("serial")
@Entity public class GroupInfo implements Serializable {
    @Id @GeneratedValue private Long id;

    @ElementCollection
    @OrderColumn
    private List<String> groupLabels;
    @ElementCollection
    @OrderColumn
    private List<String> groupDescriptions;

    public GroupInfo() {
        groupLabels = new ArrayList<String>();
        groupDescriptions = new ArrayList<String>();
    }

    public List<String> getGroupLabels() {
        return groupLabels;
    }
    public List<String> getGroupDescriptions() {
        return groupDescriptions;
    }
}

此类尝试持久化对象:

import java.util.*;

import javax.persistence.*;

public class TestIt {

    public static void main(String... args) throws Exception {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("JpaTest");
        EntityManager em = emf.createEntityManager();

        MyClass myClass = new MyClass();
        GroupInfo groupInfo = new GroupInfo();
        groupInfo.getGroupLabels().addAll(new ArrayList<String>(Arrays.asList(new String[] {"SKEWNESS"})));
        myClass.getComputationGroupMap().put("BILLPROGRESS", groupInfo);

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        em.persist(myClass);
        tx.commit();

        em.close();
    }

}

据我所知,这是问题表:

create table MyClass_GroupInfo (
    MyClass_id int8 not null,
    computationGroupMap_id int8 not null,
    computationGroupMap_KEY varchar(255),
    aggregateGroupMap_id int8 not null,
    aggregateGroupMap_KEY varchar(255),
    primary key (MyClass_id, aggregateGroupMap_KEY)
);

我尝试添加 @Column(nullable=true) 但没有任何区别。有什么建议吗?

最佳答案

尝试添加@JoinColumn属性,

@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name = "aggregateGroupMapId", nullable = true)
private Map<String, GroupInfo> aggregateGroupMap; 
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name = "computationGroupMapId", nullable = true)
private Map<String, GroupInfo> computationGroupMap;

您还应该检查 hibernate documentation关于 map 。也许,在那里你会找到更适合你的问题的东西。

关于java - 具有多个映射和相同值类型的 Hibernate 模式生成错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25960847/

相关文章:

java - @OnDelete 仅与 @OneToMany 一起使用

postgresql - Postgis 经度、纬度转几何 postgresql

sql - Postgres 数据聚合与可变列

c# - 如何在 Windows 7 上静默安装 Postgresql

java - 如何知道.jar文件目录

java - 为什么trim()给我字符串常量池引用?

Java注释: dynamically build array based on annotated fields

java.text.ParseException : Unparseable date: "2018-05-23T06:39:37+0000" 异常

hibernate - 列表中一个域对象上的StaleObjectStateException会影响所有剩余的更新

java - 为什么 Hibernate 在现有值为 null 时执行 INSERT 而不是 UPDATE?