hibernate集合映射与列表和超级实体类

时间:2009-08-07 18:43:23

标签: java hibernate java-ee nhibernate-mapping

在这里,我再次参与自我学习的冬眠和个人实验项目,以获得更多的理解。 这是我的环境的描述: 我有一个超级模型实体,我的模型继承自.it只有id属性 我使用hibernate网站上的genericDAO模式。 现在我的问题是我使用列表而不是为我的一对多映射设置(这里没有必要避免重复),当我在列表索引或列表索引属性中引用超级实体ID时,我有这样的错误: org.hibernate.NonUniqueObjectException:具有相同标识符值的其他对象已与会话关联 这是超级实体接口

public interface Model extends Serializable {
public Long getId();
public void setId(Long id);
}

//here is its implementation.they are not in the same physical file
public abstract class ModelImpl implements Model {
private Long id;
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}

}

这是它的映射文件

<class abstract="true" name="ModelImpl">
<!--i removed doctype and stuffs-->
<id name="id">
  <generator class="assigned"/>
</id>
</class>

这里是pojo界面,这是我的父母

public interface Message extends Model {
Date getDateSent();
String getGlobalStatus(); 

}    //它的实现在这里,但在不同的物理文件上     public class MessageImpl extends ModelImpl实现Message {     private String globalStatus;     private List response = new ArrayList();     私人约会dateSent;     //塞特犬和吸气剂....    }

它的映射文件是这样的:

<union-subclass extends="ModelImpl" name="MessageImpl">
<property name="globalStatus"/>
<property name="dateSent" type="timestamp"/>

                  &LT; /集&gt; - &GT;                                        

我评论了这个集合,因为它被给出了一个转换错误,这让我意识到我的错误 所以父类的Response类在这里:

public interface Response extends Model {
String getGatewayMessageId();
Message getMessageId();
}
//its implementation but in different physical file
public class ResponseImpl extends ModelImpl implements Response{

private static final long serialVersionUID = 1L;

private Message messageId;
private String gatewayMessageId;
//setters and getters..
}

所以基本上就是那样。在我的测试中,当我尝试用它的孩子保存消息时,它会抛出这个:

  

org.hibernate.NonUniqueObjectException:具有相同标识符值的其他对象已与会话关联

我可以做所有持久的方法例外我刚才谈到的那个。 我有点迷失在这里因为所有人都继承了模型ID所以我做错了什么? 感谢阅读。我真的不明白这里的问题。

2 个答案:

答案 0 :(得分:0)

听起来您正在尝试使用已存在的ID保存实体。您意识到,当您使用union-subclass方法时,您可能拥有的所有子类共享相同的ID空间,是吗?

购买方式,您是否有理由手动分配ID,或生成ID帮助?

答案 1 :(得分:0)

解决它。我有一个经理(创建pojos和daos),为每个新创建的POJO注入新的Id。在测试期间我手动添加id。谢谢你的帮助