我有一个Evaluation实体,该实体具有EvaluationEvaluator的关联列表。我需要显式创建该实体,因为它需要额外的列“ STATUS”。在我继续评估之前。我这样做:evaluation.setEvaluationEvaluator(listEvaluator)其中listEvaluatorEvaluationEvaluator类型的列表。然后persist(evaluation)。当我运行它时,它不会引发任何异常。但是在数据库中,它插入到Evaluation表中,而不插入到EvaluationEvaluator表中。

在我的评估实体下方。

@Entity
public class Evaluation implements Serializable{
      @Id
      @GeneratedValue
      private Long id;

      //MORE FIELDS

      @OneToMany(mappedBy="evaluation")
      private List<EvaluationEvaluator> evaluators;

      //CONSTRUCTORS
      //GETTER AND SETTERS
}


这是我的EvalutionEvaluator实体:

@Entity
@Table(name= "EVALUATION_EVALUATOR")
@IdClass(EvaluationEvaluatorId.class)
public class EvaluationEvaluator implements Serializable{
    @Id
    @Column(name="EMPLOYEE_ID", insertable=false , updatable=false)
    private Long EmployeeID;
    @Id
    @Column(name="EVALUATION_ID", insertable=false, updatable=false)
    private Long EvaluationID;

    @ManyToOne
    @JoinColumn(name"EMPLOYEE_ID")
    private Employee employee;

    @ManyToOne
    @JoinColumn(name"EVALUATION_ID")
    private Evaluation evaluation;

    @NotNull
    private String status;

    //CONSTRUCTORS

    //GETTER AND SETTERS
}


这是我的EvaluationEvaluatorId类

public class EvaluationEvaluatorId implements Serializable{
    private Long employeeID;
    private Long evaluationID;

    //CONSTRUCTOR
    //GETTER AND SETTERS
}


最后,这是我的EvaluationBean类

@Stateful
@Named
@LocalBean
@ConversationScoped
public class EvaluationBean {
   @PersistentContext(type= PersistenceContextType.EXTENDED)
   private EntityManager em;

   @Inject
   Conversation conversation;

   private Evaluation evaluation;

   //IN MY WEBPAGE I IMPLEMENT PRIMEFACES PICKLIST AND IT REQUIRE DUALIST TO HANDLE
   private DualListModel<Employe> evaluators;

   private EvaluationEvaluator evaluationEvaluator;

   private List<EvaluationEvaluator> listEvaluators;

   @Inject
   private EmployeeList employeeList;

   //GETTER AND SETTERS

   public String begin(){
      if (conversation.isTransient()){
          converstaion.begin();
      }
      evaluationEvaluator = new EvaluationEvaluator();
      listEvaluators = new ArrayList<EvaluationEvaluator>();
      evaluation = new Evaluation();
      List<Employee> source = employeeList.findAll();
      target = new ArrayList<Employee>();
      evaluators = new DualListModel<Employee>(source, target);
      return "/evalution/evaluationAsig.xhtml"
   }
    public String save(){
        Iterator<Employee> iterator = evaluators.getTarget().iterator();
        while (iterator.hasNext()){
            EvaluationEvaluator ev = new EvaluationEvaluator();
            ev.setEmployee(iterator.next());
            listEvaluators.add(ev);
        }
        evalution.setEvaluationEvaluators(listEvaluators);
        if(evaluation.getId()==null){
           em.persist(evalution);
        } else{
           em.merge(evalution);
        }
        if(!conversation.isTransient()){
           convesation.end();
        }
        return "/evalution/evaluationsAsig.xhtml"
    }
}


当我调试我的应用程序时,显然一切都正确,但是我上面提到的,并没有持久化在EvaluationEvaluator表中。

最佳答案

您的@OneToMany关联缺少级联配置。

cascade = CascadeType.ALLcascade = {CascadeType.PERSIST, CascadeType.MERGE}添加到@OneToMany批注。 JPA默认情况下不假定级联,因此您需要明确地自己保留每个EvaluationEvaluator。



更新

代码还有另一件事-永远不会分配EvaluationEvaluators的ID。您有一个由两个长列组成的复杂键。两者都被标记为不可插入或不可更新,这告诉JPA该ID将以某种方式在数据库级别生成,因此它不必理会。但是,您的实体中没有明确配置的序列(尽管不一定需要配置),也没有您的评论:


  我按照您的建议做了,但是会引发以下异常。 “具有相同标识符的另一个对象已与该会话关联”


我假设不是这种情况,并且两个id列的值都默认为null或零,并且对于您要保留的所有EvaluationEvaluator都相同。如果您希望数据库为您自动使用@GeneratedValue-Configure JPA to let PostgreSQL generate the primary key value生成ID,则可以在此处找到有关如何执行此操作的说明(数据库部分取决于数据库,这适用于PostgreSQL)。但是,最常见的用例是配置序列,但是让休眠选择下一个值,此处说明-Hibernate sequence on oracle, @GeneratedValue(strategy = GenerationType.AUTO)

08-05 08:33