【问题标题】:How to do not update attributes of an entry if such value is null jpa如果此类值为空 jpa,如何不更新条目的属性
【发布时间】:2015-02-18 22:40:52
【问题描述】:

我正在更新我的数据库中的一个条目,为此我创建了一个对象,其中只有我想要更新的字段。

我的问题是数据库中的空字段也被替换了。所以当我只想忽略那些空值时,数据库中的非空值会被空值替换。

我尝试在 @Entity 中使用 @DynamicUpdate 注释,但它不起作用,因为它仍然用 null 替换那些非空值,因为它们具有不同的值。

到目前为止,这是我的代码:

@Entity
@DynamicUpdate
@Table(name = "Exer")
public class Exer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long id;
    private String nome;
    private String grupo;
    private String path;
}

在控制器中:

Exer exer = new Exer();
exer.setId(4);
exer.setNome("value");
exerDao.update(exer);

更新的dao实现:

@PersistenceContext
private EntityManager em;

@Transactional
public Exer update(Exer exer) {
    return em.merge(exer);
}

在这种情况下,我只想将 Nome 更改为“值”,而是为此条目的其他两个字段插入 null。

【问题讨论】:

    标签: java mysql hibernate jpa annotations


    【解决方案1】:

    这不是您使用 JPA 进行更新的方式。您首先从数据库中获取现有实体,例如 EM.find(Exer.class,KEY),然后设置要更新的字段、提交事务等。 JPA 将仅更新已更改的字段。

    em.getTransaction().begin();//or skip if transaction is managed by controler
    Exer exer = em.find(Exer.class,4);
    exer.setNome("value");
    em.getTransaction().commit(); //skip if transaction is managed
    

    【讨论】:

    • 老实说,我一开始也想过这样做.. 但后来我想知道是否还有另一种“更优雅”的方式.. 但谢谢!这样我很确定它会起作用:)
    • 我也有点担心它的性能,因为如果我们编写原始 SQL 语句,我们需要执行两个查询来完成我们只需一个查询就可以轻松完成的事情
    • 该对象可能已经在 J​​PA 上下文中,因此它可能只是一个查询。如果您在某个时候发现这两个查询会影响您的应用程序性能,您可以随时重构它并手动调用 sql。但我确信您系统的其他部分将成为瓶颈,而不是 jpa 查询。
    • 是的,你是对的。我最终使用了这种方法,它不应该有任何严重的性能问题 :)
    猜你喜欢
    • 2018-04-06
    • 2012-10-29
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多