【问题标题】:What hibernate do with unmapped column?hibernate 对未映射的列做了什么?
【发布时间】:2017-04-09 01:06:01
【问题描述】:

假设有这样一个类:

public class Entity {
    private Long id;
    private String name;
}

还有 3 列的表格:id、name 和 address。

CREATE TABLE entity (
    id NUMBER(9,0),
    name VARCHAR2(255),
    address VARCHAR2(1000),

然后执行插入:

INSERT INTO entity (id, name, address) VALUES (1, "a", "b")

然后我们加载和更新hibernate实体:

Session session = ...
Entity entity = session.get(Entity.class, 1);

然后更新名称并再次保存:

entity.setName("newName");
session.save(entity);

那么现在地址列的值是什么 - null 或 b? hibernate 是否为这种情况提供了一些策略,或者我必须 在实体中添加address字段并将其标记为@Column(updatable=false, insertable = false)

【问题讨论】:

  • 如果它没有被映射,那么它就会被忽略。地址值将是相同的“b”。
  • @Cherry 你试过了吗?

标签: java hibernate


【解决方案1】:

如果您将以下属性放入persistence.xml(或您已定义休眠属性的位置)

<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.format_sql" value="false"/>

然后你可以看到当服务器在调试模式下运行并且日志配置为调试时休眠执行的查询。

如果你的实体是

public class Entity {
    private Long id;
    private String name;
    private String secondName;
    //Getters & Setters
}

然后在HQL下执行

SELECT e FROM Entity e WHERE e.id = 121

会产生类似于

的结果
SELECT entity0_.id        AS id1_63_, 
       entity0_.name      AS name6_63_, 
       entity0_.secondName AS secondName6_63_, 
FROM   yout_db.Entity entity0_ 
WHERE  entity0_.id = 121

您会看到这里 SELECT * FROM Entity 没有执行,而是从 Class 中提取所有字段并将其添加到查询中。因此,如果您忽略了 DB 中的任何字段,那么它将不会参与查询。

对于 Select-Update 也会发生同样的事情。

entity.setName("newName");
session.save(entity);

如果您要更新实体,以下是格式化查询:

UPDATE your_db.Entity 
SET    name = ?
       secondName = ?
WHERE  id = ?

即使只更改了一个字段,也会执行此查询。

【讨论】:

    【解决方案2】:

    Hibernate 仅对取自实体的列进行操作,基于属性名称或注释中的描述。因此,在您的情况下,“地址”值将是“b”。

    【讨论】:

    • 你能用 dicunentation 链接证明吗?
    猜你喜欢
    • 2020-09-29
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多