Помогите понять спящий режим / ошибку - PullRequest
1 голос
/ 24 февраля 2011

У меня есть класс Product, который имеет ассоциацию 1-ко-многим (составной шаблон). Ниже приведены pojo, hbm, тестовый код и log / error соответственно. Может кто-нибудь объяснить, о чем эта ошибка. Почему я получаю эту ошибку при установке первичного ключа родителя?

Продукт pojo

public class Product
{
    private Long id;

    private Set<Product> children = Collections.emptySet();

    public void addChild(final Product child)
    {
        if (children.isEmpty())
        {
            children = Sets.newHashSet();
        }
        child.setParent(this);
        children.add(child);
    }
}

hbm.xml

<class name="Product" table="PRODUCT">
        <set name="children" lazy="false" table="PRODUCT">
            <key>
                <column name="ID" />
            </key>
            <one-to-many class="Product" />
        </set>
</class>

Тест

public void save()
    {
        // Level 1 - mortgage LOB
        Product mortgage = new Product();
        mortgage.setCode("Mortgage");

        Product ml = new Product();
        ml.setCode("Mortgage Loan");

        Product me = new Product();
        me.setCode("Home Equity LOC");

        //Level 2
        mortgage.addChild(ml);
        mortgage.addChild(me);

        hibernateTemplate.save(mortgage);
    }

журнал и ошибка

DEBUG [org.hibernate.SQL] insert into PRODUCT (ID, CODE, NAME, STARTDATE, ENDDATE, ISDECISIONABLE, ISSELECTABLE) values (null, ?, ?, ?, ?, ?, ?)
DEBUG [org.hibernate.type.StringType] binding 'Mortgage' to parameter: 1
DEBUG [org.hibernate.type.StringType] binding null to parameter: 2
DEBUG [org.hibernate.type.TimestampType] binding null to parameter: 3
DEBUG [org.hibernate.type.TimestampType] binding null to parameter: 4
DEBUG [org.hibernate.type.BooleanType] binding 'false' to parameter: 5
DEBUG [org.hibernate.type.BooleanType] binding 'false' to parameter: 6
DEBUG [org.hibernate.SQL] call identity()
DEBUG [org.hibernate.SQL] update PRODUCT set ID=? where ID=?
DEBUG [org.hibernate.type.LongType] binding '1' to parameter: 1
ERROR [org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.Product
    at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
    at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
    at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:78)

Ответы [ 2 ]

4 голосов
/ 24 февраля 2011

Временный объект - это объект, который не был сохранен.Как показано, ваши отношения не используют никакой «транзитивной персистентности», то есть вы не сказали hibernate, что когда вы сохраняете родителя, вы хотите спасти детей.Я предполагаю, что ошибка в том, что у вас есть экземпляры дочерних элементов (не имеет значения, что дочерние элементы имеют один и тот же класс родительского элемента) на родительском элементе (в сеансе), и hibernate знает об этом, но не знаетчто с ними делать.

Вы можете либо:

1) сохранить дочерние элементы перед сохранением родителя
2) добавить атрибут 'cascade' в ваше отображение, что-то вроде cascade ="сохранить" или каскад = "все"

см. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-transitive

0 голосов
/ 24 февраля 2011

ну, я не думаю, что весь твой код прав?потому что в вашем pojo вы должны иметь геттеры и сеттеры для вашего набора.И попробуйте сохранить продукт следующим образом:

Set children=new HashSet();
Product p=new Product(); 
Product p1=new Product(); 
Product p2=new Product();
children.add(p1);
children.add(p2);
p.setChildren(children);
hibernateTemplate.save(p);

Но поместите cascade = "all" или cascade = "save-update" в ваше отображение набора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...