Java 用jpa映射多对多关系和可嵌入类
我在我的应用程序中使用EJB3和JPA2,我有两个实体,它们有许多to关系,我想将它们持久化,但幸运的是,经过数小时的仔细研究和尝试,我无法做到这一点,因此这是我的代码:Java 用jpa映射多对多关系和可嵌入类,java,jpa,many-to-many,Java,Jpa,Many To Many,我在我的应用程序中使用EJB3和JPA2,我有两个实体,它们有许多to关系,我想将它们持久化,但幸运的是,经过数小时的仔细研究和尝试,我无法做到这一点,因此这是我的代码: @Entity public class Destinataire implements Serializable { @Id @Basic(optional = false) @Size(min = 1, max = 50) @Column(name = "ADRESSE") pri
@Entity
public class Destinataire implements Serializable {
@Id
@Basic(optional = false)
@Size(min = 1, max = 50)
@Column(name = "ADRESSE")
private String adresse;
@OneToMany(mappedBy = "destinataire")
private Set<Envois> envoisSet;
//getters and setters
}
@Entity
public class Envois implements Serializable {
@EmbeddedId
protected EnvoisPK envoisPK = new EnvoisPK();
@Size(max = 4)
@Column(name = "TYPENVOIS")
private String typenvois;
@JoinColumn(name = "IDMAIL", referencedColumnName = "IDMAIL", insertable = false, updatable = false)
@ManyToOne(optional = false)
private MailAEnvoyer mailAEnvoyer;
@JoinColumn(name = "ADRESSE", referencedColumnName = "ADRESSE", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Destinataire destinataire;
}
@Embeddable
public class EnvoisPK implements Serializable {
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 255)
@Column(name = "ADRESSE")
private String adresse;
@Basic(optional = false)
@NotNull
@Column(name = "IDMAIL")
private BigDecimal idmail;
}
@Entity
@Table(name = "MAILAENVOYER")
public class MailAEnvoyer implements Serializable {
private static final long serialVersionUID = 1L;
// @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "IDMAIL")
private BigDecimal idmail;
@JoinTable(name = "ENVOIS", joinColumns = {
@JoinColumn(name = "IDMAIL", referencedColumnName = "IDMAIL")}, inverseJoinColumns = {
@JoinColumn(name = "ADRESSE", referencedColumnName = "ADRESSE")})
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
private Set<Destinataire> destinataireSet;
@OneToMany(mappedBy = "mailAEnvoyer", cascade = CascadeType.ALL)
private Set<Envois> envoisSet;
}
但我总是得到一个例外,EnvoisPK的address和idmail为null
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("MAILING"."ENVOIS"."IDMAIL")
Error Code: 1400
Call: INSERT INTO ENVOIS (TYPENVOIS, IDMAIL, ADRESSE) VALUES (?, ?, ?)
bind => [3 parameters bound]
Query: InsertObjectQuery(entities.Envois[ envoisPK=entities.EnvoisPK[ adresse=null, idmail=null ] ])
您可以使用以下方法在实体MaileEnvoyer中添加:
@PostPersist
public void postPersist() {
for (Envois e : envoisSet) {
e.getEnvoisPK().setIdmail(this.getIdmail());
}
}
当您询问异常时,至少必须发布完整的异常堆栈跟踪。
@PostPersist
public void postPersist() {
for (Envois e : envoisSet) {
e.getEnvoisPK().setIdmail(this.getIdmail());
}
}