【问题标题】:Hibernate mapping and mergingHibernate 映射和合并
【发布时间】:2011-06-22 10:06:42
【问题描述】:

我有 2 个这样的课程:

消息(id、标题、内容)

MessageEmployee(id, messageId, employeeId, readFlag)

还有两个这样的表:

MESSAGE(mess_id, mess_title, mess_content)

MESSAGE_EMPLOYEE(mess_empl_id, mess_id, empl_id, read_fg)

映射文件:

    <hibernate-mapping package="core">
        <class name="Message" table="MESSAGE">
            <!-- class id -->
            <id name="id" type="int" column="MESS_ID" length="11">
                <generator class="native"/>
            </id>

            <property name="content" type="string" column="MESS_CONTENT" />
            <property name="title" type="string" column="MESS_TITLE" /> 
        </class>
    </hibernate-mapping>


    <hibernate-mapping package="core">
        <class name="MessageEmployee" table="MESSAGE_EMPLOYEE">
            <!-- class id -->
            <id name="id" type="int" column="MESS_EMPL_ID" length="11">
                <generator class="native"/>
            </id>

            <!-- employee -->
            <many-to-one name="employee" class="core.Employee"
                column="EMPL_ID" cascade="save-update,merge" lazy="false" />

            <!-- message -->
            <many-to-one name="message" class="core.Message"
                column="MESS_ID" cascade="save-update,merge" lazy="false" />

            <property name="readFlag" type="character" column="READ_FG" />      
        </class>
    </hibernate-mapping>

这是我的问题: 假设我已经在数据库中有一条消息,我想创建一个 messageEmployee 并保存它。

代码 sn-p:

    Message sent = new Message(content, title);
    Employee e = employeeDao.loadEmployeeWithId(Integer.valueOf(to));

    messageDao.merge(sent)

    MessageEmployee m = new MessageEmployee(sent, e, null);
    m.setReadFlag('N');
    messageEmployeeDao.mergeMessageEmploye(m);

当我merge(messageEmployee) 时,它会在数据库中创建一个新的message 和一个新的messageEmployee,但我不希望它创建一个新的message

我很确定我的映射是错误的,因为我不是专家,所以我可以改变什么来获得我想要的行为?

【问题讨论】:

  • 尝试在 Message 类的多对一映射中使用 cascade="none"。
  • 试过了,还是不行。
  • 你能给我一些代码sn-p吗?

标签: database hibernate hibernate-mapping


【解决方案1】:

它将创建一个新的Message 对象,因为您没有在消息对象sent 中提供id。当你执行messageDao.merge(sent)时,发送的对象没有和id合并。它是纯粹的瞬态对象。尝试从 Employee 等数据库中加载它。

【讨论】:

  • 好的,谢谢!我刚刚添加了sent = messageDao.merge(sent); 以获得一个ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多