gpt4 book ai didi

java - 保留与使用 @idclass 的实体列表关联的实体

转载 作者:太空宇宙 更新时间:2023-11-04 14:51:18 25 4
gpt4 key购买 nike

我有一个 Evaluation 实体,它具有关联的 EvaluationEvaluator 列表。我需要显式创建该实体,因为它需要一个额外的列“STATUS”。在我继续评估之前。我这样做:evaluation.setEvaluationEvaluator(listEvaluator)其中listEvaluatorEvaluationEvaluator类型的列表。然后坚持(评估)。当我运行它时,它不会抛出任何类型的异常。但在数据库中,它插入到 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 从未被分配。您有一个由两个长列组成的复杂 key 。两者都被标记为不可插入或可更新,这告诉 JPA id 将以某种方式在数据库级别生成,并且它不应该关心它。然而,您的实体中没有明确配置序列(尽管不一定是必需的),并且您的评论也没有明确配置:

I did what you recommended but it throws the following exception. "A different object with same identifier was already associated with the session"

我假设情况并非如此,两个 id 列值都默认为 null,并且对于您所在的所有 EvaluationEvaluators 都是相同的努力坚持。如果您希望数据库自动为您生成 id,请使用 @GenerateValue - Configure JPA to let PostgreSQL generate the primary key value - 在这里您可以找到如何执行此操作的说明(数据库部分依赖于数据库,这是针对 PostgreSQL 的)。然而,最常见的用例是配置序列但让 hibernate 选择下一个值,此处说明 - Hibernate sequence on oracle, @GeneratedValue(strategy = GenerationType.AUTO)

关于java - 保留与使用 @idclass 的实体列表关联的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23743866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com