Java 保存中间表时出错
我有这个相关的实体 Entity.javaJava 保存中间表时出错,java,jpa,Java,Jpa,我有这个相关的实体 Entity.java @Entity @Table(name = "entity") public class Entidad extends BaseEntity { /** * Serial */ private static final long serialVersionUID = 3453805453717178734L; protected String name; protected String im
@Entity
@Table(name = "entity")
public class Entidad extends BaseEntity {
/**
* Serial
*/
private static final long serialVersionUID = 3453805453717178734L;
protected String name;
protected String image;
protected String notes;
@OrderBy("id")
@ManyToMany
protected Set<EntityHeader> headersType = new HashSet<EntityHeader>();
//Getters and setters
}
@Entity
@Table(name = "header_type")
public class HeaderType extends BaseEntity {
/**
* Serial
*/
private static final long serialVersionUID = -7471230510640592406L;
private String name;
@OrderBy("id")
@ManyToMany
private Set<EntityHeader> entities = new HashSet<EntityHeader>();
//Getters and setters
}
@Entity
@Table(name = "entity_header")
public class EntityHeader implements Serializable{
/**
* Serial
*/
private static final long serialVersionUID = 1710372870796468955L;
@Id
@ManyToOne
private Entidad entity;
@Id
@ManyToOne
private HeaderType headerType;
private String value;
//Getters and setters
}
@Entity
@Table(name = "entity")
public class Entidad extends BaseEntity {
/**
* Serial
*/
private static final long serialVersionUID = 3453805453717178734L;
@Id
//@GeneratedValue(strategy= GenerationType.TABLE) -- this annotations enables automatic generation for table ids
protected Long id;
protected String name;
protected String image;
protected String notes;
@OrderBy("id")
@OneToMany(mappedBy = "entity")
protected Set<EntityHeader> headersType = new HashSet<EntityHeader>();
//Getters and setters
}
@Entity
@Table(name = "header_type")
public class HeaderType extends AbstractBasicEntity {
/**
* Serial
*/
private static final long serialVersionUID = -7471230510640592406L;
@Id
//@GeneratedValue(strategy= GenerationType.TABLE) -- this annotations enables automatic generation for table ids
protected Long id;
private String name;
@OrderBy("id")
@OneToMany(mappedBy = "headerType")
private Set<EntityHeader> entities = new HashSet<EntityHeader>();
//Getters and setters
}
@Entity
@Table(name = "entity_header")
public class EntityHeader implements Serializable{
/**
* Serial
*/
private static final long serialVersionUID = 1710372870796468955L;
@Id
private Long id;
@ManyToOne
@JoinColumn
private Entidad entity;
@ManyToOne
@JoinColumn
private HeaderType headerType;
private String value;
//Getters and setters
}
因此,当我想保存一个没有EntityHeader数据的实体时,它会做得很好,但是,如果我尝试设置EntityHeader字段并保存它(保存person或单独保存EntityHeader并使用Entity和HeadersType的正确值),我会得到以下消息:
org.hibernate.TypeMismatchException:为提供的id类型错误
类es.paquete.basicas.entidades.intermedias.EntityHeader。预期:
类es.paquete.basicas.entidades.intermedias.EntityHeader,获得类
java.lang.Long
编辑:主要类的ID在BaseEntity中EntityHeader上的主键没有意义: @Id注释 指定实体的主键。指向的字段或属性 应用的Id注释应为以下类型之一:任意 Java原语类型;任何原始包装类型;一串 java.util.Date;java.sql.Date;java.math.BigDecimal; java.math.biginger 看看
您需要查看实体的主键,以便它们也可以相互引用。我认为,要使这些实体正常工作,必须解决一些问题:
- 每个实体必须有自己的@Id字段
- 感觉“很多关系”都不合适;实际上,每个EntityHeader和每个HeaderType都与它们的EntityHeader有一对多的关系
@Entity
@Table(name = "entity")
public class Entidad extends BaseEntity {
/**
* Serial
*/
private static final long serialVersionUID = 3453805453717178734L;
protected String name;
protected String image;
protected String notes;
@OrderBy("id")
@ManyToMany
protected Set<EntityHeader> headersType = new HashSet<EntityHeader>();
//Getters and setters
}
@Entity
@Table(name = "header_type")
public class HeaderType extends BaseEntity {
/**
* Serial
*/
private static final long serialVersionUID = -7471230510640592406L;
private String name;
@OrderBy("id")
@ManyToMany
private Set<EntityHeader> entities = new HashSet<EntityHeader>();
//Getters and setters
}
@Entity
@Table(name = "entity_header")
public class EntityHeader implements Serializable{
/**
* Serial
*/
private static final long serialVersionUID = 1710372870796468955L;
@Id
@ManyToOne
private Entidad entity;
@Id
@ManyToOne
private HeaderType headerType;
private String value;
//Getters and setters
}
@Entity
@Table(name = "entity")
public class Entidad extends BaseEntity {
/**
* Serial
*/
private static final long serialVersionUID = 3453805453717178734L;
@Id
//@GeneratedValue(strategy= GenerationType.TABLE) -- this annotations enables automatic generation for table ids
protected Long id;
protected String name;
protected String image;
protected String notes;
@OrderBy("id")
@OneToMany(mappedBy = "entity")
protected Set<EntityHeader> headersType = new HashSet<EntityHeader>();
//Getters and setters
}
@Entity
@Table(name = "header_type")
public class HeaderType extends AbstractBasicEntity {
/**
* Serial
*/
private static final long serialVersionUID = -7471230510640592406L;
@Id
//@GeneratedValue(strategy= GenerationType.TABLE) -- this annotations enables automatic generation for table ids
protected Long id;
private String name;
@OrderBy("id")
@OneToMany(mappedBy = "headerType")
private Set<EntityHeader> entities = new HashSet<EntityHeader>();
//Getters and setters
}
@Entity
@Table(name = "entity_header")
public class EntityHeader implements Serializable{
/**
* Serial
*/
private static final long serialVersionUID = 1710372870796468955L;
@Id
private Long id;
@ManyToOne
@JoinColumn
private Entidad entity;
@ManyToOne
@JoinColumn
private HeaderType headerType;
private String value;
//Getters and setters
}
这个解决方案需要改进,但我希望它能帮助您走上正确的道路
PS:如果我犯了任何英文错误,很抱歉。多个Id字段意味着您需要定义一个IdClass。实际上,HeaderType和Entidad都有一个Id,该字段位于BaseEntity@Kratul我曾经想象过这样的事情,但我只是想确定id是否存在于每个相关实体中