【问题标题】:Hibernate insert error: ids for this class must be manually assigned before calling save():Hibernate 插入错误:必须在调用 save() 之前手动分配此类的 id:
【发布时间】:2012-08-31 14:00:57
【问题描述】:

我有这个无法解决的问题,这是我的实体类:

/** * @hibernate.class * table="users.network_topic" * @hibernate.cache 用法="读写" */ 公共类 NetworkTopic 实现 Serializable、Idable{

/** identifier field */
private Long id;

/** persistent field */
private Long networkId;

/** persistent field */
private Long topicId;

private UserTopic topic;
private Network network;

/** 
 *            @hibernate.id
 *             generator-class="assigned"
 *             type="java.lang.Long"
 *             column="id"
 */
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

/** 
 *            @hibernate.property
 *             type="java.lang.Long"
 *             column="network_id"
 *             not-null="true"
 */
public Long getNetworkId() {
    return networkId;
}

public void setNetworkId(Long networkId) {
    this.networkId = networkId;
}

/** 
 *            @hibernate.property
 *             type="java.lang.Long"
 *             column="user_topic_id"
 *             not-null="true"
 */
public Long getTopicId() {
    return topicId;
}

public void setTopicId(Long topicId) {
    this.topicId = topicId;
}   

/** 
 *            @hibernate.set
 *             lazy="true"
 *             inverse="true"
 *             cascade="none"
 *            @hibernate.key
 *             column="user_topic_id"
 *            @hibernate.one-to-many
 *             class="com.netblue.matchpoint.domain.UserTopic"
 *         
 */
public UserTopic getTopic() {
    return topic;
}

public void setTopic(UserTopic topic) {
    this.topic = topic;
}   

/** 
 *            @hibernate.set
 *             lazy="true"
 *             inverse="true"
 *             cascade="none"
 *            @hibernate.key
 *             column="network_id"
 *            @hibernate.one-to-many
 *             class="com.netblue.matchpoint.domain.Network"
 *         
 */    
public Network getNetwork() {
    return network;
}

public void setNetwork(Network network) {
    this.network = network;
}   

@Override
public String toString() {
    return "Network[id=" + id + "]";
}

}

然后我尝试使用此代码保存一个新寄存器:

        UserTopic topic = new UserTopic();
        topic.setId(topicId);
        topic.setName(ParseUtil.getString(map.get(MPConstants.TOPIC_NAME_PARAM)));
        topic.setCreatedBy(ParseUtil.getInt(map.get(MPConstants.USER_ID)));
        Date now = new Date();
        topic.setCreatedDt(now);
        topic.setLastUpdatedDt(now);
        topic.setStatusId(Status.ACTIVE);
        topic.setActivityCnt(0);
        userTopicDao.saveOrUpdate(topic);

        UserTopicMap utm = new UserTopicMap();
        utm.setId(topicId);
        utm.setMtid(topicId);
        utm.setOtid(topicId);
        utm.setIsDeleted(false);
        utm.setLastUpdatedDt(now);
        userTopicMapDao.saveOrUpdate(utm);

        Network network = MpAuctionUtil.getNetworkById(networkId);
        NetworkTopic networkTopic = new NetworkTopic();
        networkTopic.setNetworkId(networkId);
        networkTopic.setTopicId(topicId);
        networkTopic.setNetwork(network);
        networkTopic.setTopic(topic);
        LOG.debug("userTopicService addObjSubscriber x networkId="+networkId+", topicId="+topicId);
        networkTopicDao.saveOrUpdate(networkTopic);

最后几行是失败的,如果我删除它们它可以工作,我的意思是它可以保存主题,但是当我尝试这样做时它失败了,我不知道我是否做错了什么,拜托帮帮我!!

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    尚未为 NetworkTopic 类分配 ID。您必须使用 setId 方法或考虑考虑其他 id 策略之一

    2.2.3.1. Generating the identifier property

    【讨论】:

    • 数据库配置为自动生成ID,我认为注释生成器-class="assigned" 负责这个...
    • assigned 意味着该类希望您手动分配 id。根据您在数据库中用于生成 id 的内容,您可能会考虑在 autoidentitysequence 之间使用策略。
    【解决方案2】:
    NetworkTopic networkTopic = new NetworkTopic();
        networkTopic.setNetworkId(networkId);
        networkTopic.setTopicId(topicId);
        networkTopic.setNetwork(network);
        networkTopic.setTopic(topic);
        LOG.debug("userTopicService addObjSubscriber x networkId="+networkId+", topicId="+topicId);
        networkTopicDao.saveOrUpdate(networkTopic);
    

    这里,你必须调用方法setId,并手动设置值,因为你的id生成器是“分配的”,也就是说你每次插入或更新数据之前都必须手动分配!

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 2011-07-24
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2015-11-18
      • 2016-03-22
      相关资源
      最近更新 更多