【问题标题】:How to store recursive object in database?如何将递归对象存储在数据库中?
【发布时间】:2018-06-15 00:42:48
【问题描述】:

我如何存储一个引用了同一类的其他对象的对象?

我尝试了很多方法来使用注释和 XML,但都失败了。

在最好的情况下,我会收到以下错误:

警告:使用语句“INSERT INTO UNIT ("NAME",PARENT_UNIT_ID,ID) VALUES (?,?,?)" 插入对象 "pmo.domain.entities.Unit@1129829c" 失败:参数 "#2"未设置; SQL 语句: INSERT INTO UNIT ("NAME",PARENT_UNIT_ID,ID) 值 (?,?,?) [90012-196]

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

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.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>

【问题讨论】:

  • 您不能将一条记录与另一条不存在的记录的键一起存储,无论它是否属于同一类。在您的情况下,您的第一次保存将失败,因为父级为空
  • @jr593 在没有填充 parentUnit 的情况下进行的其他测试中运行良好。只有在表明它失败的情况下。我正在寻找以另一种方式实现这种关系的方法。

标签: java xml database h2 datanucleus


【解决方案1】:

我已经通过反转关系解决了这个问题。 从孩子到父母。所以现在,它是使用集合的父子关系。

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");
        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 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="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>

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多