在这里,我再次参与自我学习的冬眠和个人实验项目,以获得更多的理解。 这是我的环境的描述: 我有一个超级模型实体,我的模型继承自.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所以我做错了什么? 感谢阅读。我真的不明白这里的问题。
答案 0 :(得分:0)
听起来您正在尝试使用已存在的ID保存实体。您意识到,当您使用union-subclass方法时,您可能拥有的所有子类共享相同的ID空间,是吗?
购买方式,您是否有理由手动分配ID,或生成ID帮助?
答案 1 :(得分:0)
解决它。我有一个经理(创建pojos和daos),为每个新创建的POJO注入新的Id。在测试期间我手动添加id。谢谢你的帮助