Java hibernate:合并/插入操作期间缺少参数
我想在DB中插入一个条目,它填充了所有字段,并且与另一个表/类的关系为@ManyToOne。为此,我正在调用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 (?, ?,
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()
定义 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数据库进行的测试,没有进一步的问题
希望这能对遇到同样问题的人有所帮助