hibernate对未映射的列做了什么?

时间:2017-04-07 04:38:35

标签: java hibernate

假设有一个类似的类:

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)

2 个答案:

答案 0 :(得分:1)

如果要将以下属性放在persistence.xml中(或者已经定义了hibernate属性的地方)

Id  Name  Technology
1   Abcd  Hadoop
2   Efgh  Java
3   Ijkl  MainFrames
2   Efgh  Java

然后你可以看到当服务器在调试模式下运行时,hibernate执行的查询,并且已经配置为调试配置。

如果您的实体是

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

然后在HQL下面执行

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

会产生类似于

的结果
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 未执行,而是提取了类中的所有字段并将其添加到查询中。因此,如果您忽略了DB中的任何字段,那么它将不会参与查询。

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

SELECT * FROM Entity

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

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

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

答案 1 :(得分:0)

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