假设有一个类似的类:
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)
?
答案 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”。