2017-10-02 17 views
1

データベースを追加および更新するHRシステムがあります。永続化とマージのJPA関係に問題があります。これは、null値を渡すたびに発生します。 org.hibernate:によって引き起こさ :[トランザクションのコミット中にエラーRollbackException]:私たちの要求ではNULL可能することができますが、でも、私は次のようなエラーが発生した部署例えばそれにnull値を入力するときJPA OneToOne永続性にnullを渡す

。 TransientObjectException:オブジェクト保存されていない一時的なインスタンスを参照する - フラッシュする前に一時的なインスタンス を保存: - ここに参考> models.db.Department

私のエンティティクラスです Employee.class

models.db.Employee.Departmentを
@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は(保存)

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); 
} 
} 

とEmpDomain.updateEmp()

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

私は初心者のプレイ2の初心者ですので、例外エラーを修正する方法はわかりません。

答えて

1

これらの依存関係を双方向としてマップしようとしているようです。

この場合、永続性プロバイダに関係の所有/所有側を伝える必要があります。

従業員は、例えば所有する側であるならば、あなたはへのマッピングを変更する必要があります:あなたはEmployeeエンティティからマージしているならば、あなたは、少なくとも持続し、オプションをカスケードマージを置くべきでも

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

+0

私は実際にどのようにjpa関係が働くかを知りません。どのような単方向性または双対性。私の目標は、このOracle SQLコードをJPA Mergeに変換することです。 'EMPLOYEES' ' SET' 'UPDATE'' FIRST_NAME =、 '' LAST_NAME =、 '' JOB_ID =、 '' MANAGER_ID =、 '' DEPARTMENT_ID =、 '' WHERE' 'EMPLOYEE_ID =?;' しかし、JPAリレーションシップの仕事は本当にありません。マッピングやその他のもので。私は何とかそれを更新するために持っていますが、私は部署やマネージャーやジョブに値を入れないと、ロールバック例外が発生します。 – NoobProgrammer

+0

指定されたemplyeeにカスケードオプションを追加しようとしました。 –

関連する問題