具有列表和超级实体类的java hibernate集合映射
在这里,我再次在我的自我学习冬眠和个人实验项目,以获得更多的了解。 以下是对我的环境的描述: 我有一个超级模型实体,我的所有模型都继承自该实体。它只有id属性 我使用hibernate网站上的genericDAO模式。 现在我的问题是,我使用list而不是set进行一对多映射(此处无需避免重复),当我在list index或list index属性中引用超级实体id时,出现以下错误: 组织。冬眠UnuniqueObjectException:具有相同标识符值的不同对象已与会话关联 这是超级实体接口
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();
} //它的实现在这里,但在不同的物理文件上 公共类MessageImpl扩展ModelImpl实现消息{ 私有字符串globalStatus; 私有列表响应=新建ArrayList(); 已发送的私人日期; //二传手和接球手。。。。 }
其映射文件如下所示:
<union-subclass extends="ModelImpl" name="MessageImpl">
<property name="globalStatus"/>
<property name="dateSent" type="timestamp"/>
</设置>--&燃气轮机;
我评论了这一集,因为它有一个铸造错误,这使我意识到我的错误 因此,作为父级的响应类在这里:
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: a different object with the same identifier value was already associated with the session
我可以做所有的持久方法,除了我刚才提到的那个。 我在这里有点迷茫,因为他们都继承了模型id,那么我做错了什么? 谢谢你的阅读。我不太明白这里的问题
# 1 楼答案
听起来你想用一个已经存在的ID保存一个实体。您意识到,当您使用联合子类方法时,您可能拥有的所有子类共享相同的ID空间,是吗
顺便问一下,你有没有理由手动分配ID,或者生成的ID会有帮助
# 2 楼答案
解决它。我有一个管理器(创建POJO和DAO),为每个新创建的POJO注入新的Id。在测试过程中,我手动添加id。谢谢你的帮助