Java 如何在数据库中存储递归对象?
如何存储引用了同一类的其他对象的对象 我尝试了很多使用注释和XML的方法,但都失败了 在最好的情况下,我会得到以下错误: 警告:插入对象“pmo.domain.entities”。Unit@1129829c“使用语句”插入单元(“名称”,父单元ID,ID)值(?,?)失败:未设置参数“#2”;SQL语句: 在单元中插入(“名称”,父单元ID,ID)值(?,?)[90012-196] ExampleTest.java:Java 如何在数据库中存储递归对象?,java,xml,database,h2,datanucleus,Java,Xml,Database,H2,Datanucleus,如何存储引用了同一类的其他对象的对象 我尝试了很多使用注释和XML的方法,但都失败了 在最好的情况下,我会得到以下错误: 警告:插入对象“pmo.domain.entities”。Unit@1129829c“使用语句”插入单元(“名称”,父单元ID,ID)值(?,?)失败:未设置参数“#2”;SQL语句: 在单元中插入(“名称”,父单元ID,ID)值(?,?)[90012-196] ExampleTest.java: package pmo.domain.entities; public cl
package pmo.domain.entities;
public class ExampleTest {
public static void Main(String[] args) {
Unit unit1 = new Unit(0, "Unit 1");
Unit unit2 = new Unit(1, "Unit 2", unit1);
Unit unit3 = new Unit(2, "Unit 3", unit2);
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("Test");
PersistanceManager pm = pmf.getPersistenceManager();
Transaction transaction = pm.currentTransaction();
try {
transaction.begin();
pm.makePersistent(unit1);
pm.makePersistent(unit2);
pm.makePersistent(unit3);
transaction.commit();
} finally {
if (transaction.isActive()) {
transaction.rollback();
}
pm.close();
}
}
}
package pmo.domain.entities;
public class ExampleTest {
public static void Main(String[] args) {
Unit unit1 = new Unit(0, "Unit 1");
Unit unit2 = new Unit(1, "Unit 2");
Unit unit3 = new Unit(2, "Unit 3");
unit2.addUnit(unit3);
unit1.addUnit(unit2);
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("Test");
PersistanceManager pm = pmf.getPersistenceManager();
Transaction transaction = pm.currentTransaction();
try {
transaction.begin();
pm.makePersistent(unit1);
transaction.commit();
} finally {
if (transaction.isActive()) {
transaction.rollback();
}
pm.close();
}
}
}
Unit.java:
package pmo.domain.entities;
public class Unit {
private long id;
private String name;
private Unit parentUnit;
public Unit(long id, String name, Unit parentUnit) {
this.id = id;
this.name = name;
this.parentUnit = parentUnit;
}
public Unit(long id, String name) {
this(id, name, null);
}
}
package pmo.domain.entities;
public class Unit {
private long id;
private String name;
private Collection<Unit> childUnits;
public Unit(long id, String name, Collection<Unit> childUnits) {
this.id = id;
this.name = name;
this.childUnits = childUnits;
}
public Unit(long id, String name) {
this(id, name, new ArrayList<>());
}
public void addUnit(Unit unit) {
this.childUnits.add(unit);
}
public void removeUnit(long id) {
childUnits.removeIf(unit -> unit.id == id);
}
}
package.jdo:
<?xml version="1.0" encoding="UTF-8" ?>
<jdo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/jdo/jdo"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/jdo/jdo http://xmlns.jcp.org/xml/ns/jdo/jdo_3_1.xsd" version="3.1">
<package name="pmo.domain.entities">
<class name="Unit" table="unit">
<field name="id" primary-key="true">
<column name="id"/>
</field>
<field name="parentUnit">
<column name="parent_unit_id" target-field="id"/>
<foreign-key name="unit_id_fk" />
</field>
</class>
</package>
</jdo>
<?xml version="1.0" encoding="UTF-8" ?>
<jdo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/jdo/jdo"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/jdo/jdo http://xmlns.jcp.org/xml/ns/jdo/jdo_3_1.xsd" version="3.1">
<package name="es.indra.pmo.pmomanagement.domain.entities">
<class name="Employee" table="employee">
<field name="id" primary-key="true"/>
</class>
<class name="Unit" table="unit">
<field name="id" primary-key="true">
<column name="id"/>
</field>
<field name="childUnits">
<order column="parent_unit_id"/>
</field>
</class>
</package>
</jdo>
我通过颠倒关系解决了这个问题。 从孩子到父母。现在,它是使用集合的父到子 ExampleTest.java:
package pmo.domain.entities;
public class ExampleTest {
public static void Main(String[] args) {
Unit unit1 = new Unit(0, "Unit 1");
Unit unit2 = new Unit(1, "Unit 2", unit1);
Unit unit3 = new Unit(2, "Unit 3", unit2);
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("Test");
PersistanceManager pm = pmf.getPersistenceManager();
Transaction transaction = pm.currentTransaction();
try {
transaction.begin();
pm.makePersistent(unit1);
pm.makePersistent(unit2);
pm.makePersistent(unit3);
transaction.commit();
} finally {
if (transaction.isActive()) {
transaction.rollback();
}
pm.close();
}
}
}
package pmo.domain.entities;
public class ExampleTest {
public static void Main(String[] args) {
Unit unit1 = new Unit(0, "Unit 1");
Unit unit2 = new Unit(1, "Unit 2");
Unit unit3 = new Unit(2, "Unit 3");
unit2.addUnit(unit3);
unit1.addUnit(unit2);
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("Test");
PersistanceManager pm = pmf.getPersistenceManager();
Transaction transaction = pm.currentTransaction();
try {
transaction.begin();
pm.makePersistent(unit1);
transaction.commit();
} finally {
if (transaction.isActive()) {
transaction.rollback();
}
pm.close();
}
}
}
Unit.java:
package pmo.domain.entities;
public class Unit {
private long id;
private String name;
private Unit parentUnit;
public Unit(long id, String name, Unit parentUnit) {
this.id = id;
this.name = name;
this.parentUnit = parentUnit;
}
public Unit(long id, String name) {
this(id, name, null);
}
}
package pmo.domain.entities;
public class Unit {
private long id;
private String name;
private Collection<Unit> childUnits;
public Unit(long id, String name, Collection<Unit> childUnits) {
this.id = id;
this.name = name;
this.childUnits = childUnits;
}
public Unit(long id, String name) {
this(id, name, new ArrayList<>());
}
public void addUnit(Unit unit) {
this.childUnits.add(unit);
}
public void removeUnit(long id) {
childUnits.removeIf(unit -> unit.id == id);
}
}
包pmo.domain.entities;
公营课组{
私人长id;
私有字符串名称;
私人收藏单位;
公共单位(长id、字符串名称、集合子单位){
this.id=id;
this.name=名称;
this.childUnits=childUnits;
}
公共单位(长id、字符串名称){
此(id、名称、新ArrayList());
}
公共单位(单位){
this.childUnits.add(单位);
}
公共无效删除单元(长id){
childUnits.removeIf(unit->unit.id==id);
}
}
package.jdo:
<?xml version="1.0" encoding="UTF-8" ?>
<jdo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/jdo/jdo"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/jdo/jdo http://xmlns.jcp.org/xml/ns/jdo/jdo_3_1.xsd" version="3.1">
<package name="pmo.domain.entities">
<class name="Unit" table="unit">
<field name="id" primary-key="true">
<column name="id"/>
</field>
<field name="parentUnit">
<column name="parent_unit_id" target-field="id"/>
<foreign-key name="unit_id_fk" />
</field>
</class>
</package>
</jdo>
<?xml version="1.0" encoding="UTF-8" ?>
<jdo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/jdo/jdo"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/jdo/jdo http://xmlns.jcp.org/xml/ns/jdo/jdo_3_1.xsd" version="3.1">
<package name="es.indra.pmo.pmomanagement.domain.entities">
<class name="Employee" table="employee">
<field name="id" primary-key="true"/>
</class>
<class name="Unit" table="unit">
<field name="id" primary-key="true">
<column name="id"/>
</field>
<field name="childUnits">
<order column="parent_unit_id"/>
</field>
</class>
</package>
</jdo>
无论是否属于同一类,都不能存储一条记录,该记录的键指向另一条不存在的记录。在您的情况下,第一次保存将失败,因为父级是null@jr593在其他的测试中,我在没有父母的情况下做的测试很好。只有在证明它失败的情况下才可以。我正在寻找以另一种方式实现这种关系的方法。