java - JPA 不会将 Id 从包装对象添加到数据库

标签 java mysql jpa insert entitymanager

使用 JPA 我有一个数据配置,可以毫无问题地添加到数据库中:

   @Entity @Table(name = "dataConfigurations", uniqueConstraints = {@UniqueConstraint(columnNames = {"name"})})
    @NamedQueries({@NamedQuery(name = "DataConfigurations.names", query = "SELECT d.name FROM DataConfiguration d"), @NamedQuery(name = "DataConfiguration.findByName", query = "SELECT d FROM DataConfiguration d WHERE d.name = :name")})
    public class DataConfiguration implements Serializable
    {

        @Transient
        private static final long serialVersionUID = 1L;
        @Id //@GeneratedValue(strategy = GenerationType.)
            //@TableGenerator(name = "dataConfigurationSequence", table = "Sequences", pkColumnName = "NameSequences", valueColumnName = "valueSequence", pkColumnValue = "dataConfigurationId")
        private long id;
        @OneToMany(mappedBy = "dataConfiguration", cascade = CascadeType.ALL)
        private List<Content> contents; // "Data" is a reserved SQL word.
        @ManyToMany(mappedBy = "dataConfigurations", cascade = CascadeType.ALL)
        private List<LabelType> labelTypes;
        private String name;
        @OneToMany(mappedBy = "dataConfiguration", cascade = CascadeType.ALL
        private List<Template> templates;

这个Dataconfiguration包含一个Contents列表(一对多关系), 其他映射(模板和标签类型目前无关紧要,但稍后会在我的程序中出现,它们可能会给我带来与内容相同的问题)

@Entity @Table(name = "contents", uniqueConstraints = {@UniqueConstraint(columnNames = {"dataConfigurationId", "displayOrder"})})
    public class Content implements Serializable
    {
        @Transient
        private static transient final long serialVersionUID = 1L;
        @Id //@GeneratedValue(strategy = GenerationType.IDENTITY)
            //@TableGenerator(name = "contentSequence", table = "Sequences", pkColumnName = "NameSequences", valueColumnName = "valueSequence", pkColumnValue = "contentId")
        private long id;
        private String content; // "Data" is a reserved word in traditional SQL.
            @ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "dataConfigurationId")
        private DataConfiguration dataConfiguration;
        private int displayOrder;
        private int editableFrom;
        private String typeDiscriminator;

这是启动保存方法的 Controller 方法:

public String saveDataConfiguration()
{
    dataConfiguration = new DataConfiguration(getNextId(), dataConfigurationName, contents);
    dataConfigurationFacade.create(dataConfiguration);
    return null;
}

create 方法是 AbstractFacade 的一部分

public void create(T entity)
{
    getEntityManager().persist(entity);
        getEntityManager().flush();
}

当我执行该方法时,除了内容表中数据配置的 Id 之外的所有内容都被保存。 (数据配置的外键不保存在内容中​​) 任何提示和/或提示都会非常有帮助!

最佳答案

您可能忘记了初始化每个内容的字段dataConfiguration。这是映射到连接列的那个,因此它是 Hibernate 检查以确定两个实体之间是否存在关联的那个。

关于java - JPA 不会将 Id 从包装对象添加到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8598925/

相关文章:

mysql - 选择并计算日期为今天和本周的结果组

java - 在 JPA 中为非规范化表定义一个实体(充当聚合器)

java - Jersey :com.sun.jersey.server.impl.template.ViewableMessageBodyWriter

java - 将斜杠添加到 Java 中的枚举

java - 命名未定义数量的变量

java - 从 JavaFX : Can not set javafx. scene.control.Label 字段 application.SceneController.myLabel 开始到 javafx.scene.text.Text

mysql - 如何计算累积平均值

python - 使用 Python 将包含复杂日期值的字符串转换为日期

java - JpaSystemException - 无法设置字段值 [auditEntity] 扩展扩展实体

java - FetchType.EAGER 执行时间很多