6

在我的示例中,我有一个 Hibernate 实体和一个 DAO。

@Entity
@Table(name="myEntity")
public class MyEntity {

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private long id;

    @Column(name="action")
    private String actionName;

}

...................

@Repository("myDAO")
@Transactional(propagation = Propagation.REQUIRED)
public class MyDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public void saveObject(MyEntity myEntity){
        sessionFactory.getCurrentSession().save(myEntity);
    }

}

当我以这种方式使用 DAO in Service 时

@Service("myService")
@Transactional(propagation = Propagation.REQUIRED)
public class MyService 
{

    @Autowired
    private MyDAO myDAO;

    public void executeTransaction(){
        MyEntity myEntity = new MyEntity();

        myEntity.setActionName("Action1");
        myDAO.saveObject(myEntity);

//      myEntity = new MyEntity();
        myEntity.setActionName("Action2");
        myDAO.saveObject(myEntity);
    }

}

只有一行(Action2)保存在数据库中。当我删除评论时,两行(Action1 和 Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法执行事务())执行。为什么在服务层上没有事务注释,两行都保存在数据库中,只有最后一个与此注释一起保存?

4

2 回答 2

5

没有 myEntity = new MyEntity();你在数据库中的记录被更新,而不是插入,因为它是同一个实体。我建议<property name="show_sql">true</property>在hibernate conf中设置。这将向您展示正在发生的事情。

于 2013-05-21T13:49:13.260 回答
0

只有当您存储两个不同的对象时,才会将两条不同的记录保存在数据库中。当您评论该行时,您正在同一对象中设置(意味着更新)属性。因此,休眠将更新同一行,而不是创建一个新行。但是,当您取消注释该行时,您正在创建一个尚未持久化的新实例。因此,它将导致在数据库中插入一个新行。

于 2013-05-22T05:18:05.307 回答