许多额外的列eclipselink不起作用

时间:2015-04-02 15:50:44

标签: java oracle jpa many-to-many eclipselink

我试图用额外的列(日期)表示多对多关联,如下所示:

Encaissement(id)----- Etat_Encaissement(id_etat)(多对多关系)

新协会是EncaissementEtatEncaissement,它将拥有两个实体的两个ID和一个额外的列Date-Etat。

我已按照此文档执行完全相同的步骤。这是我的课程: ==================== 实体招募 ===================== =

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="ENCAISS_TYPE")
@Table(name="ENCAISSEMENT")
public class Encaissement extends encaiss implements Serializable{

    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_CLIENT")
    protected Client Client;


    @OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, mappedBy="encaissement")
    protected Set<EncaissementEtatEncaissement> etats_enc_etats;

    // Ajouter un etat a l'encaissement.
    public void addEtat(Etat_Encaissement etat, Date dateEtat) {
      EncaissementEtatEncaissement encaiss_etat_encaiss = new EncaissementEtatEncaissement();
      encaiss_etat_encaiss.setEtat_encaissements(etat);
      encaiss_etat_encaiss.setEncaissement(this);
      encaiss_etat_encaiss.setId_etat_encaissement(etat.getId_etat_encaissement());
      encaiss_etat_encaiss.setId_encaissement(this.getId_encaissement());
      encaiss_etat_encaiss.setDateEtat(dateEtat);

      this.etats_enc_etats.add(encaiss_etat_encaiss);
      // Also add the association object to the etat.
      etat.getEncaissements().add(encaiss_etat_encaiss);
    }

    @Column(name="LIBELLE")
    protected String libelle;
    @Column(name="PIECE_JOINTE")
    protected String piece_jointe;
    public Set<EncaissementEtatEncaissement> getEtats_enc_etats() {
        return etats_enc_etats;
    }

    public void setEtats_enc_etats(Set<EncaissementEtatEncaissement> etats_enc_etats) {
        this.etats_enc_etats = etats_enc_etats;
    }

    @Temporal(TemporalType.DATE)
    @Column(name="DATE_ENCAISSEMENT")
    protected Date date_encaissement;
    @Embedded
    protected Avis_Recette avis_recette;

    public Encaissement(String libelle, String piece_jointe, Date date_encaissement){
        this.libelle=libelle;
        this.piece_jointe=piece_jointe;
        this.date_encaissement=date_encaissement;
    }

    public Encaissement(){

    }

}

==================== 实体Etat_Encaissement ================== ====

@Entity
@Table(name="ETAT_ENCAISSEMENT")
public class Etat_Encaissement implements Serializable{

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO, generator="etat_encaissement_seq_gen")
    @SequenceGenerator(name="etat_encaissement_seq_gen", sequenceName="ETAT_ENCAISSEMENT_SEQ", allocationSize = 1, initialValue = 1)
    private long id_etat_encaissement; 

    //@ManyToMany(mappedBy="etats", cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    //private Set<Encaissement> Encaissements;

    @OneToMany(mappedBy="etat_encaissements")
    private Set<EncaissementEtatEncaissement> encaissements;


    @Column(name="LIBELLE")
    private String libelle;

    public Etat_Encaissement(String libelle){ 
        this.libelle=libelle;
    }

    public Etat_Encaissement(){

    }

}

================ 实体Encaissement_Etat_Encaissement ==================== 此实体包含Encaissement和Etat_Encaissement的ID以及日期列

@Entity
@Table(name="ENCAISSEMENT_ETAT_ENCAISSEMENT")
@IdClass(EncaissementEtatEncaissementId.class)
public class EncaissementEtatEncaissement {

      @Id
      private long id_etat_encaissement;
      @Id
      private long id_encaissement;


      @Temporal(TemporalType.DATE)
      @Column(name="DATE_ETAT_ENCAISS")
      private Date dateEtat;

      @ManyToOne
      @PrimaryKeyJoinColumn(name="ID_ETAT_ENCAISSEMENT", referencedColumnName="ID_ETAT_ENCAISSEMENT")

      private Etat_Encaissement etat_encaissements;

    @ManyToOne
      @PrimaryKeyJoinColumn(name="ID_ENCAISSEMENT", referencedColumnName="ID_ENCAISSEMENT")
false, referencedColumnName = "id")

      private Encaissement encaissement;


        public EncaissementEtatEncaissement(Date dateEtat){
            this.dateEtat=dateEtat;
        }

        public EncaissementEtatEncaissement(){

        }
}

最后一堂课的最终成绩:

public class EncaissementEtatEncaissementId implements Serializable{

    private long id_etat_encaissement;

    private long id_encaissement;

    public int hashCode() {
        return (int)(id_etat_encaissement + id_encaissement);
      }

    public boolean equals(Object object) {
        if (object instanceof EncaissementEtatEncaissementId) {
            EncaissementEtatEncaissementId otherId = (EncaissementEtatEncaissementId) object;
          return (otherId.id_etat_encaissement == this.id_etat_encaissement) && (otherId.id_encaissement == this.id_encaissement);
        }
        return false;
      }

}

==============我使用这个简单的代码将Etat_encaissement的实例与Encaissement相关联,通常会在Encaissement_Etat_Encaissement中添加一个新行========== ===================

private Etat_Encaissement etat_record;

    //Code here

etat_record=saut.getEtatFromLibelle("source_identifiee");//This just return an instance of Etat

encaissEspece.addEtat(etat_record, new java.util.Date()); // here i call addEtat which trigger the problem 

问题:

我在类 Encaissement [this.etats_enc_etats.add(encaiss_etat_encaiss);]中的addEtat方法中得到 java.lang.Exception ,并且日志表明etats_enc_etats是 null 所以我不能将Encaissement_Etat(在这种情况下为记录)添加到Encaissement(本例中为encaissEspece)以及所有这些因为etats_enc_etats == null

的实例

(再次:

@OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, mappedBy="encaissement")
    protected Set<EncaissementEtatEncaissement> etats_enc_etats; //)

任何人都可以帮助我。谢谢。

1 个答案:

答案 0 :(得分:1)

您遇到的问题可能是由于您没有设置基本映射上的@ID。由于这些为null,因此JPA会在PK值中插入null。您必须在当前设置中手动设置ID映射,这需要先保留Encaissement和Etat_Encaissement实例并刷新以便分配其ID,然后使用这些值设置EncaissementEtatEncaissement实例的id_etat_encaissement和id_encaissement值。

如果您使用的是JPA 2.1,您可以使用@ID标记EncaissementEtatEncaissement etat_encaissements和encaissement关系,JPA将为您设置值:

@Entity
@Table(name="ENCAISSEMENT_ETAT_ENCAISSEMENT")
@IdClass(EncaissementEtatEncaissementId.class)
public class EncaissementEtatEncaissement {

  @Temporal(TemporalType.DATE)
  @Column(name="DATE_ETAT_ENCAISS")
  private Date dateEtat;

  @Id
  @ManyToOne
  @JoinColumn(name="ID_ETAT_ENCAISSEMENT", referencedColumnName="ID_ETAT_ENCAISSEMENT")
  private Etat_Encaissement etat_encaissements;

  @Id
  @ManyToOne
  @JoinColumn(name="ID_ENCAISSEMENT", referencedColumnName = "id")
  private Encaissement encaissement;
..
}

您也可以使用@MapsId注释并保留id_etat_encaissement和id_encaissement属性,但如果您不使用它们,则不需要它们。