2017-10-02 4 views
1

J'ai un système HR qui va ajouter et mettre à jour la base de données. J'ai un problème dans ma relation JPA dans persistent et fusionne chaque fois que je passerais une valeur nulle sur elle. Dans notre exigence, il peut être annulable, mais quand même j'entre une valeur nulle à elle par exemple les départements l'erreur suivante se produit:Passage null à JPA OneToOne Persist

[RollbackException: Erreur lors de validation de la transaction] Causée par: org.hibernate. TransientObjectException: objet référence une instance transitoire non enregistré - sauvegarder l'instance transitoire avant le rinçage: models.db.Employee.Department -> models.db.Department

Pour référence ici sont ma classe d'entité Employee.class

@Entity 
@Table(name="EMPLOYEES") 
public class Employee { 

@Id 
public Integer EMPLOYEE_ID; 

public String FIRST_NAME; 

public String LAST_NAME; 

@OneToOne 
@JoinColumn(name= "JOB_ID") 
public Job Job; 

@OneToOne 
@JoinColumn(name="MANAGER_ID") 
public Employee Manager; 

@OneToOne 
@JoinColumn(name= "DEPARTMENT_ID") 
public Department Department; 

} 

Job.class

@Entity 
@Table(name="JOBS") 
public class Job { 

@Id 
public String JOB_ID; 

public String JOB_TITLE; 

} 

Department.class

@Entity 
@Table(name="DEPARTMENTS") 
public class Department { 

@Id 
public Integer DEPARTMENT_ID; 

public String DEPARTMENT_NAME; 

@OneToOne(cascade = {CascadeType.ALL}) 
@JoinColumn(name="MANAGER_ID") 
public Employee Manager; 
} 

AppModel.class sauver()

public void save() { 
int intSize = listSize + 1; 
for (int i= 0; i < intSize; i++) { 
Employee employee = new Employee(); 

Job job = new Job(); 
job.JOB_ID = employees.get("empJobId" + i); 

Department dept = new Department(); 
dept.DEPARTMENT_ID = ParseUtil.stringToInt(employees.get("empDeptId" + i)); 

Employee manager = new Employee(); 
manager.EMPLOYEE_ID = ParseUtil.stringToInt(employees.get("empMgrId" + i)); 

Integer intId = ParseUtil.stringToInt(employees.get("empId" + i)); 
employee.EMPLOYEE_ID = intId; 
employee.FIRST_NAME = employees.get("empFirstName" + i); 
employee.LAST_NAME = employees.get("empLastName" + i); 
employee.Job = job; 
employee.Department = dept; 
employee.Manager = manager; 
EmpDomain.updateEmp(employee); 
} 
} 

Et EmpDomain.updateEmp()

public static void updateEmp(Employee employee) { 
    JPA.em().merge(employee); 
} 

Im seulement un débutant sur le jeu 2, la persistance de jpa donc je ne sais pas comment réparer l'erreur d'exception s'il vous plaît aider.

Répondre

1

Il semble que vous essayez de mapper ces dépendances comme bidirectionnelles.

Dans ce cas, vous devez indiquer au fournisseur de persistance quel est le côté propriétaire/propriétaire de la relation.

Si l'employé est du côté propriétaire par exemple, alors vous devez changer le mappage:

@OneToOne(mappedBy = "Manager", cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
public Department Department; 

également si vous fusionnez de l'entité employé alors vous devez mettre au moins persister et fusionner l'option en cascade.

+0

Je ne comprends pas vraiment comment fonctionne la relation jpa. Qu'est-ce qu'un uni-directionnel ou bi. mon but est de convertir ce code SQL Oracle en JPA Merge. '' update' EMPLOYEES' '' set' prenom =?, '' LAST_NAME =?, '' JOB_ID =?, '' manager_id =?, '' DEPARTMENT_ID =?, '' OERE ' ' EMPLOYEE_ID =?; ' Mais je ne fais pas vraiment fonctionner la relation JPA. dans la cartographie et d'autres choses. Je l'ai en quelque sorte eu pour mettre à jour mais quand je ne mettez pas une valeur sur les départements ou le directeur ou les travaux l'exception de restauration se produit. – NoobProgrammer

+0

essayez d'ajouter les options en cascade sur l'emplyee comme indiqué –