Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate:合并/插入操作期间缺少参数_Java_Hibernate_Jpa - Fatal编程技术网

Java hibernate:合并/插入操作期间缺少参数

Java hibernate:合并/插入操作期间缺少参数,java,hibernate,jpa,Java,Hibernate,Jpa,我想在DB中插入一个条目,它填充了所有字段,并且与另一个表/类的关系为@ManyToOne。为此,我正在调用entityManager.merge(c1),其中我的c1是一个Classification实例(根据下面的定义),我可以在日志中看到以下内容: [DEBUG] ...: c=o.h.SQL, m=logStatement, l=92, msg: insert into plat.classification_system (year, system, id) values (?, ?,

我想在DB中插入一个条目,它填充了所有字段,并且与另一个表/类的关系为@ManyToOne。为此,我正在调用
entityManager.merge(c1)
,其中我的
c1
是一个
Classification
实例(根据下面的定义),我可以在日志中看到以下内容:

[DEBUG] ...: c=o.h.SQL, m=logStatement, l=92, msg: insert into plat.classification_system (year, system, id) values (?, ?, ?)
[TRACE] ...: c=o.h.t.d.s.BasicBinder, m=bind, l=65, msg: binding parameter [1] as [VARCHAR] - [2012]
[TRACE] ...: c=o.h.t.d.s.BasicBinder, m=bind, l=65, msg: binding parameter [2] as [BIGINT] - [1000001]
[TRACE] ...: c=o.h.t.d.s.BasicBinder, m=bind, l=65, msg: binding parameter [3] as [VARCHAR] - [main_system]
…当我真的希望看到像

[DEBUG] ...: c=o.h.SQL, m=logStatement, l=92, msg: insert into plat.classification_system (year, system, id, classification_type) values (?, ?, ?, ?)
[TRACE] ...: c=o.h.t.d.s.BasicBinder, m=bind, l=65, msg: binding parameter [1] as [VARCHAR] - [2012]
[TRACE] ...: c=o.h.t.d.s.BasicBinder, m=bind, l=65, msg: binding parameter [2] as [BIGINT] - [1000001]
[TRACE] ...: c=o.h.t.d.s.BasicBinder, m=bind, l=65, msg: binding parameter [3] as [VARCHAR] - [main_system]
[TRACE] ...: c=o.h.t.d.s.BasicBinder, m=bind, l=65, msg: binding parameter [4] as [VARCHAR] - [abc]
我有以下课程

    /* entity being stored */
    @Entity
    @Table("classification_system", indexes = {
        @Index(name="CLASS_IDX1",columnList="ID"),
        @Index(name="CLASS_IDX2",columnList="ID, SYSTEM"),
        @Index(name="CLASS_IDX3",columnList="ID, CLASS_TYPE_GUID, SYSTEM")
    })
    class Classification extends ClassificationAbstract implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="classSeq")
    @SequenceGenerator(name="classSeq", sequenceName="CLASS_SEQ", allocationSize=1)
    private Long id;

    //`enter code here` couple of constructors...

    private String system;

    public Classification() {
        super();
    }

    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getSystem() {
        return this.system;
    }
    public void setSystem(String system) {
        this.system = system;
    }
}

@MappedSuperclass
public abstract class ClassificationAbstract implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(nullable = false)
    @NotNull
    private String year;

    @ManyToOne(fetch = FetchType.EAGER, optional = false, targetEntity = ClassificationType.class)
        @JoinColumns(value = {
            @JoinColumn(name = "YEAR", referencedColumnName = "YEAR", insertable = false, updatable = false),
            @JoinColumn(name = "CLASS_TYPE_GUID", referencedColumnName = "GUID", insertable = false, updatable = false)
    }) //tried using 'true' and doesn't run
    private ClassificationType classificationType;

    public ClassificationType getClassificationType() {
        return classificationType;
    }
    public void setClassificationType(ClassificationType classificationType) {
        this.classificationType = classificationType;
    }

    public String getYear() {
        return this.year;
    }
    public void setYear(String year) {
        this.year = year;
    }
}

/* view CLASS_TYPE */
@Entity
@Table(name="CLASS_TYPE", uniqueConstraints = 
        @UniqueConstraint(columnNames = {"YEAR", "GUID","SYSTEM_TYPE_GUID"})
)
@Immutable
public class ClassificationType extends Type implements Serializable {
    private static final long serialVersionUID = 1L;

    private String code;
    @Column(name = "YEAR", nullable = false)
    private String year;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "YEAR", referencedColumnName = "YEAR",
                insertable = false, updatable = false, nullable = false),
        @JoinColumn(name = "SYSTEM_TYPE_GUID", referencedColumnName = "GUID",
                insertable = false, updatable = false, nullable = false)
    })
    private SystemType systemType;

    public String getCode() {
        return this.code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getYear() {
        return this.year;
    }
    public void setYear(String year) {
        this.year = year;
    }
    public String getSystemType() {
        return this.systemType;
    }
    public void setSystemType(String systemType) {
        this.systemType = systemType;
    }
}

/* view SYSTEM_TYPE */
@Entity
@Table(name="SYSTEM_TYPE", uniqueConstraints = 
        @UniqueConstraint(columnNames = {"YEAR", "GUID"})
)
@Immutable
public class SystemType extends Type implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name = "YEAR", nullable = false)
    private String year;
    private String code;

    public String getCode() {
        return this.code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getYear() {
        return this.year;
    }
    public void setYear(String year) {
        this.year = year;
    }
}

@MappedSuperclass
public abstract class Type implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(length = 48)
    private String guid;

    public String getGuid() {
        return this.guid;
    }
    public void setGuid(String guid) {
        this.guid = guid;
    }
}
…表示以下模型:

    create table classification_system (
     id number(19, 0) not null,
     year varchar2(255 char) not null,
     class_type_guid(48 char ) not null,
     system varchar2(255 char) not null,
     primary key (id)
    )

    create table class_type (
      guid (48 char) not null,
      code varchar2(255 char) not null,
      year varchar2(255 char) not null,
      system_type_guid varchar2(48 char) not null,

      primary key (guid)
    )

    create table system_type (
      guid (48 char ) not null,
      code varchar2(255 char) not null,
      year varchar2(255 char) not null,
      primary key (guid)
    )
我一直在挖掘很多与
@ManyToOne
映射/关系相关的帖子,但还没有找到任何我可以使用的东西。 这是用Hibernate 5.0.9构建的

有人能帮我解决这个问题吗?
感谢您在这件事上的帮助。

毕竟,在熟练的帮助下,我最后只给出了以下解决方案到Java说明和注释:

@MappedSuperclass
public abstract class ClassificationAbstract implements Serializable {
    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
        @JoinColumns(value = {
            @JoinColumn(name = "YEAR", referencedColumnName = "YEAR", nullable = false),
            @JoinColumn(name = "CLASS_TYPE_GUID", referencedColumnName = "GUID", nullable = false)
    })
    private ClassificationType classificationType;

    public ClassificationType getClassificationType() {
        return classificationType;
    }
    public void setClassificationType(ClassificationType classificationType) {
        this.classificationType = classificationType;
    }
}
  • 分类
    原样分类

  • ClassificationAbstract
    中删除了
    year
    属性以及
    insertable=null、updateable=null
    注释:

    @MappedSuperclass
    public abstract class ClassificationAbstract implements Serializable {
        private static final long serialVersionUID = 1L;
    
        @ManyToOne(fetch = FetchType.EAGER, optional = false)
            @JoinColumns(value = {
                @JoinColumn(name = "YEAR", referencedColumnName = "YEAR", nullable = false),
                @JoinColumn(name = "CLASS_TYPE_GUID", referencedColumnName = "GUID", nullable = false)
        })
        private ClassificationType classificationType;
    
        public ClassificationType getClassificationType() {
            return classificationType;
        }
        public void setClassificationType(ClassificationType classificationType) {
            this.classificationType = classificationType;
        }
    }
    
  • ClassificationType
    SystemType
    中删除了
    .hashCode()
    .equals()
    定义,因为它们在对象级别上搞乱了一切

  • ClassificationTypePK
    SystemTypePK
    中保留
    .hashCode()
    .equals()
    定义

  • 现在一切正常,甚至JPA/HBMDDL生成也在构建预期的列定义:

        create table classification_system (
         id number(19, 0) not null,
         year varchar2(255 char) not null,
         class_type_guid(48 char ) not null,
         system varchar2(255 char) not null,
         primary key (id)
        )
    
        create table class_type (
          guid (48 char) not null,
          code varchar2(255 char) not null,
          year varchar2(255 char) not null,
          system_type_guid varchar2(48 char) not null,
    
          primary key (guid, year)
        )
    
        create table system_type (
          guid (48 char ) not null,
          translation varchar2(255 char) not null,
          year varchar2(255 char) not null,
          primary key (guid, year)
        )
    
    我应该记得,我在JavaEE7/Java8应用程序上使用的是Hibernate5.0.9(最终版),这是针对Oracle XE数据库进行的测试,没有进一步的问题

    希望这能对遇到同样问题的人有所帮助