オブジェクトを永続化するために、Eclipse で OpenJPA を使用しています。簡単な 1 対 1 の一方向アプリケーションを作成しました。しかし、Foreign key null エラーが発生しています。
学生団体
@Entity
public class Student implements Serializable {
@Id
private int id;
private String name;
private static final long serialVersionUID = 1L;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "dept_id", unique = true, nullable = true, insertable = true, updatable = true, referencedColumnName = "id")
private Department department;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public String toString() {
return "\n\nID:" + id + "\nName:" + name + "\n\n" + department;
}
}
部門エンティティ
@Entity
@Table(name = "department")
public class Department implements Serializable {
@Id
private int id;
private String name;
private static final long serialVersionUID = 1L;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String deptName) {
this.name = deptName;
}
public String toString() {
return "Department id: " + getId() + ", name: " + getName();
}
}
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="IBMJPADemo" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>com.ibm.jpa.onetoone.model.Department</class>
<class>com.ibm.jpa.onetoone.model.Student</class>
<properties>
<property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/test" />
<property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver" />
<property name="openjpa.ConnectionUserName" value="root" />
<property name="openjpa.ConnectionPassword" value="root" />
<property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO" />
<property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
<property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
<!-- property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)" /-->
<!-- property name="openjpa.jdbc.MappingDefaults"
value="ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict" /-->
</properties>
</persistence-unit>
</persistence>
クライアントプログラム
public class OneToOneClient {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence
.createEntityManagerFactory("IBMJPADemo");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Student student = new Student();
student.setId(2537);
student.setName("K.Senthuran");
Department dept = new Department();
dept.setId(100);
dept.setName("IT");
student.setDepartment(dept);
em.persist(student);
em.flush();
tx.commit();
em.close();
}
}
エラー
スレッド「メイン」org.apache.openjpa.persistence.PersistenceException での例外: org.apache.openjpa.kernel.DelegatingBroker の org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1817) で null キーは許可されていません。 org.apache.openjpa.persistence.EntityManagerImpl.flush(EntityManagerImpl.java:652) のフラッシュ (DelegatingBroker.java:1037) com.ibm.jpa.onetoone.client.OneToOneClient.main(OneToOneClient.java:32) の原因: java.lang.NullPointerException: org.apache.openjpa.kernel.ManagedCache.assignObjectId(ManagedCache.java:189) の org.apache.commons.collections.map.AbstractReferenceMap.put(AbstractReferenceMap.java:248) で null キーは許可されていません) org.apache.openjpa.kernel.BrokerImpl.assignObjectId(BrokerImpl.java:4949) で org.apache.openjpa.kernel.BrokerImpl.setStateManager(BrokerImpl.java:4046) で org.org.apache.openjpa.kernel.StateManagerImpl.assertObjectIdAssigned(StateManagerImpl.java:636) org.apache.openjpa.kernel.StateManagerImpl.afterFlush(StateManagerImpl.java:1084) org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl. java:2162) at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037) at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1808) ... 3 詳細
この問題の解決にご協力ください。
ありがとう & よろしく、
K.Senthuran