Java org.springframework.orm.jpa.JpaSystemException:无法通过反射设置字段值[POST_INSERT_INDICATOR]值
我与一个Spring Boot项目合作,我有以下实体Java org.springframework.orm.jpa.JpaSystemException:无法通过反射设置字段值[POST_INSERT_INDICATOR]值,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我与一个Spring Boot项目合作,我有以下实体 @Entity public class Ip { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "IP_ADDR_ID_2") private Long id; @Column(name = "IP_ADDRESS_2") @NotEmpty private String address
@Entity
public class Ip {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "IP_ADDR_ID_2")
private Long id;
@Column(name = "IP_ADDRESS_2")
@NotEmpty
private String address;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "ip")
private List<IMAssociation> httpInfoMessages2;
}
列表
是通过代码生成的
List<IMAssociation> imAssociations = new ArrayList<>();
for(int j =0; j < 5; j++){
IMAssociation imAssociation = new IMAssociation(Long.valueOf(integerListEntry.getKey()),
message);
imAssociations.add(imAssociation);
}
Ip ip = new Ip('127.0.0.1', imAssociations);
List<Ip> ips = new ArrayList<>();
ips.add(ip);
这里的问题是什么
更新
我已经更改了I关联
类及其下面提供的
@Entity
public class Message {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "S_ID_2")
private Long sId;
@Column(name = "STATUS_ID_2")
private Long statusId;
@NotEmpty
@Column(name = "STATUS_2")
private String status;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "message")
private List<IMAssociation> message;
}
@Entity
@Table(name = "IP_HTTP_MESSAGE")
//@IdClass(AssociationId.class)
public class IMAssociation implements Serializable {
// @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
// private Long id;
@Id
@Column(name = "IP_ADDRESS_ID")
private Long ipAddressId;
@Id
@Column(name = "HTTP_MESSAGE_ID")
private Long httpMessageId;
@ManyToOne
@PrimaryKeyJoinColumn(name = "IP_ADDRESS_ID", referencedColumnName = "IP_ADDR_ID_2")
// @JoinColumn(name = "ipAddressId", updatable = false, insertable = false, referencedColumnName = "IP_ADDR_ID_2")
private Ip ip;
@ManyToOne
@PrimaryKeyJoinColumn(name = "HTTP_MESSAGE_ID", referencedColumnName = "S_ID_2")
// @JoinColumn(name = "httpMessageId", updatable = false, insertable = false, referencedColumnName = "S_ID_2")
private Message message;
// @ManyToOne
@JoinColumn(name = "IP_ADDRESS_2", updatable = false, insertable = false, referencedColumnName = "IP_ADDRESS_2")
private String address;
@JoinColumn(name = "STATUS_CODE", updatable = false, insertable = false, referencedColumnName = "STATUS_ID_2")
private Long code;
@JoinColumn(name = "STATUS_MESSAGE", updatable = false, insertable = false, referencedColumnName = "STATUS_2")
private String codeMessage;
public IMAssociation() {
}
public IMAssociation(Long code, String codeMessage) {
this.code = code;
this.codeMessage = codeMessage;
}
}
现在,我在运行应用程序时出现以下错误
Caused by: javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.ef.entity.IMAssociation#IMAssociation{, ipAddressId=null, httpMessageId=null, ip=null, message=null, address='null', code=404, codeMessage='404_Not Found'}]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1664) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1152) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_144]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_144]
这就是你的问题:
SO的类似职位:
您可以在此处有3个选项:
imaassociation
实体中自动生成的Id。复合密钥将仅由两个属性组成—ipAddressId
和httpMessageId
,它们分别是从地址
和消息
实体派生的/外键ipAddressId
和httpMessageId
Id
、ipAddressId
和httpMessageId
,请删除Id自动生成(@GeneratedValue
注释),并手动为iAssociation
实体分配Id值可能不需要
ipAddressId
和httpMessageId
我认为保存这些值的列是通过@PrimaryKeyJoinColumn
注释在dblevel中自动生成的,并且可以通过ip.getMessage()和ip.getId()在imaassociation
中访问该值
请查看您的实体中有多个主键i关联
。您可以声明具有复合主键/复合键的@IdClass
或@EmbeddedId
,但我看不出您使用了其中任何一个。此外,您在此处使用的@PrimaryKeyJoinColumn
不正确。属性name
应该映射到表的物理列名,而不是某些实体属性。所以它应该是@PrimaryKeyColumn(name=“IP\u ADDRESS\u ID”,referencedColumnName=“IP\u ADDR\u ID\u 2”)
和@PrimaryKeyColumn(name=“HTTP\u MESSAGE\u ID”,referencedColumnName=“S\u ID\u 2”)
我已经尝试过@IdClass(AssociationId.class)
在Ip
类的顶部,其中AssociationId
实现了可序列化的。这并不能解决问题,仍然会提供相同的错误。使用@EmbeddedId
的正确方法是什么?我用它代替了@Id
,得到了一些error@Ish实际上,我已经尝试了我提供的所有建议,但仍然得到相同的错误。如果您现在有一个开放的IDE,您是否介意提供一个有效的解决方案?我已经尝试了第一个选项,但出现了一些错误。我在更新的问题中提供了错误堆栈。如果您能提供一个有效的解决方案,我将不胜感激,因为这样做不会出错,但令人惊讶的是,我在地址列中找不到任何值,我想是wiredremoveString address
和使用ip.getAddress()
@Entity
@Table(name = "IP_HTTP_MESSAGE")
//@IdClass(AssociationId.class)
public class IMAssociation implements Serializable {
// @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
// private Long id;
@Id
@Column(name = "IP_ADDRESS_ID")
private Long ipAddressId;
@Id
@Column(name = "HTTP_MESSAGE_ID")
private Long httpMessageId;
@ManyToOne
@PrimaryKeyJoinColumn(name = "IP_ADDRESS_ID", referencedColumnName = "IP_ADDR_ID_2")
// @JoinColumn(name = "ipAddressId", updatable = false, insertable = false, referencedColumnName = "IP_ADDR_ID_2")
private Ip ip;
@ManyToOne
@PrimaryKeyJoinColumn(name = "HTTP_MESSAGE_ID", referencedColumnName = "S_ID_2")
// @JoinColumn(name = "httpMessageId", updatable = false, insertable = false, referencedColumnName = "S_ID_2")
private Message message;
// @ManyToOne
@JoinColumn(name = "IP_ADDRESS_2", updatable = false, insertable = false, referencedColumnName = "IP_ADDRESS_2")
private String address;
@JoinColumn(name = "STATUS_CODE", updatable = false, insertable = false, referencedColumnName = "STATUS_ID_2")
private Long code;
@JoinColumn(name = "STATUS_MESSAGE", updatable = false, insertable = false, referencedColumnName = "STATUS_2")
private String codeMessage;
public IMAssociation() {
}
public IMAssociation(Long code, String codeMessage) {
this.code = code;
this.codeMessage = codeMessage;
}
}
Caused by: javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.ef.entity.IMAssociation#IMAssociation{, ipAddressId=null, httpMessageId=null, ip=null, message=null, address='null', code=404, codeMessage='404_Not Found'}]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1664) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1152) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_144]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_144]