Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 帮助理解休眠行为/错误_Java_Hibernate - Fatal编程技术网

Java 帮助理解休眠行为/错误

Java 帮助理解休眠行为/错误,java,hibernate,Java,Hibernate,我有一个Product类,它与自身的复合模式有一对多的关联。下面分别是pojo、hbm、测试代码和日志/错误。有人能解释一下这个错误是怎么回事吗。为什么在设置父项的主键时会出现此错误 产品pojo 日志和错误 瞬态对象是尚未保存的对象。根据映射,您的关系不使用任何“可传递持久性”,也就是说,您没有告诉hibernate,当您保存父对象时,您希望保存子对象。我猜错误是因为您有子实例,子实例在会话中与父对象上的父对象具有相同的类并不重要,hibernate知道这一点,但它不知道如何处理它们 您可以:

我有一个Product类,它与自身的复合模式有一对多的关联。下面分别是pojo、hbm、测试代码和日志/错误。有人能解释一下这个错误是怎么回事吗。为什么在设置父项的主键时会出现此错误

产品pojo

日志和错误


瞬态对象是尚未保存的对象。根据映射,您的关系不使用任何“可传递持久性”,也就是说,您没有告诉hibernate,当您保存父对象时,您希望保存子对象。我猜错误是因为您有子实例,子实例在会话中与父对象上的父对象具有相同的类并不重要,hibernate知道这一点,但它不知道如何处理它们

您可以:

1在保存父对象之前先保存子对象 2将“cascade”属性添加到映射中,如cascade=save或cascade=all


请参见

瞬态对象是尚未保存的对象。根据映射,您的关系不使用任何“可传递持久性”,也就是说,您没有告诉hibernate,当您保存父对象时,您希望保存子对象。我猜错误是因为您有子实例,子实例在会话中与父对象上的父对象具有相同的类并不重要,hibernate知道这一点,但它不知道如何处理它们

您可以:

1在保存父对象之前先保存子对象 2将“cascade”属性添加到映射中,如cascade=save或cascade=all


嗯,我不认为这就是你的全部代码正确性?因为在pojo中,你需要为你的集合设置getter和setter。并尝试通过以下方式保存您的产品:

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放在集合映射中。

我不认为这就是您的全部代码正确性?因为在pojo中,你需要为你的集合设置getter和setter。并尝试通过以下方式保存您的产品:

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放在集合映射中。

@hvgotcodes+1但这里它只是试图保存父产品抵押。hibernate甚至还没有尝试保存子对象。我的理解是,只有当hibernate试图拯救孩子时,我才应该得到这个错误……我遗漏了什么吗?@pangea,是的,但你的父母Mortage在它里面有一个到其他产品的集合。你已经建立了一种关系,从抵押贷款到ml和我都是孩子。因为您将子项放在父项的集合中,所以hibernate会在会话中看到它们。但它无法正确设置关系,因为它们尚未保存,并且您在保存父对象时没有告诉hibernate保存它们。@hvgotcodes另外,该链接还指出,在或上启用级联通常没有意义association@hvgotcodes对,我之前有多对一,后来改了。我希望我能为你的第一次投票投超过1票comment@pangea,不用担心。如果这个答案帮助您解决了问题并更好地理解了hibernate,我很高兴。@hvgotcodes+1,但这里它只是试图保存母产品抵押。hibernate甚至还没有尝试保存子对象。我的理解是,只有当hibernate试图拯救孩子时,我才应该得到这个错误……我遗漏了什么吗?@pangea,是的,但你的父母Mortage在它里面有一个到其他产品的集合。你已经建立了一种关系,从抵押贷款到ml和我都是孩子。因为您将子项放在父项的集合中,所以hibernate会在会话中看到它们。但它无法正确设置关系,因为它们尚未保存,并且您在保存父对象时没有告诉hibernate保存它们。@hvgotcodes另外,该链接还指出,在或上启用级联通常没有意义association@hvgotcodes对,我之前有多对一,后来改了。我希望我能为你的第一次投票投超过1票comment@pangea,不用担心。如果答案能帮助您解决问题并更好地理解hibernate,我很高兴。我有这段代码,但为了简洁起见删除了它。通过添加cascade=all,我得到了另一个异常。在这里发布了一个新问题,我有这个代码,但为了简洁起见删除了。通过添加cascade=all,我得到了另一个异常。在这里发布了一个新问题
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)
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);