合并后,Hibernate / JPA获取数据库中具有默认值的列的值

坦率

案例:合并对象后,我想获取映射到数据库端具有默认值的列的字段的值。

桌子:

CREATE TABLE IF NOT EXISTS `db`.`OBJECT` (
  `OBJECT_ID` INT NOT NULL AUTO_INCREMENT,
  `NAME` VARCHAR(64) NULL,
  `CREATED_ON` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
  `EDITED_ON` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

班级:

@Entity
@Table(name="OBJECT")
public class SomeObject {
    private int id;
    private String name;
    private Timestamp createdOn;
    private Timestamp editedOn;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "NAME")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "CREATED_ON", insertable = false, updatable = false)
    public Timestamp getCreatedOn() {
        return createdOn;
    }

    public void setCreatedOn(Timestamp createdOn) {
        this.createdOn = createdOn;
    }

    @Column(name = "EDITED_ON", insertable = false, updatable = false)
    public Timestamp getEditedOn() {
        return editedOn;
    }

    public void setEditedOn(Timestamp editedOn) {
        this.editedOn = editedOn;
    }
}

DAO:

@Transactional
public class ObjectDAO {
    @PersistenceContext
    private EntityManager entityManager;

    public someObject merge(someObject someObject) {
        return entityManager.merge(someObject);
    }
}

我想做的事:

SomeObject someObject = new SomeObject();
someObject.setName("name");
SomeObject insertedObject = objectDAO.merge(someObject);
System.out.println(insertedObject.getId());
System.out.println(insertedObject.getEditedOn());

结果:对象已插入数据库,所有默认值均已正确生成。

问题:为什么第二个println打印空值,而第一个println打印插入到数据库中的Id的正确值?

坦率

经过更多研究,我发现如果我使用默认数据库值,则不可能在合并返回的实体中使用它们。就那么简单。我更改方法,并使用@PrePersist@PreUpdate注释。这应该是这样的:

@Entity
@Table(name="OBJECT")
public class SomeObject {
    private int id;
    private String name;
    private Timestamp createdOn;
    private Timestamp editedOn;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "NAME")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "CREATED_ON")
    public Timestamp getCreatedOn() {
        return createdOn;
    }

    public void setCreatedOn(Timestamp createdOn) {
        this.createdOn = createdOn;
    }

    @Column(name = "EDITED_ON")
    public Timestamp getEditedOn() {
        return editedOn;
    }

    public void setEditedOn(Timestamp editedOn) {
        this.editedOn = editedOn;
    }

    @PrePersist
    public void setDates() {
        createdOn = LocalDateTime.now();
        editedOn = LocalDateTime.now();
    }

    @PreUpdate
    public void setEditedOn() {
        editedOn = LocalDateTime.now();
    }
}

为什么在返回的实体中有正确的ID?因为它实际上是由Hibernate生成的@GeneratedValue(strategy = GenerationType.IDENTITY)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有@Embedded的数据库中的Hibernate空值

来自分类Dev

具有默认值的Android Listview数据库

来自分类Dev

更改后获取输入的默认值

来自分类Dev

具有默认值的text_field无法保存到Rails中的数据库

来自分类Dev

如何在OpenERP7中使数据库字段具有默认值?

来自分类Dev

停止Spring Jpa + Hibernate重写联接数据库中的值

来自分类Dev

Hibernate / JPA,字段“ accreditation_company_id”没有默认值错误

来自分类Dev

从数据库获取后如何更改属性值

来自分类Dev

从数据库值中获取下拉文本作为选定的默认值

来自分类Dev

获取选择框以使用mysql数据库中的最新值设置默认值

来自分类Dev

Ruby 2.1.0具有默认值后重新分配实例变量

来自分类Dev

从具有合并单元格的Excel文件中获取数据并存储在MySQL数据库中

来自分类Dev

无法获取数据库默认值,返回NoSuchObjectException

来自分类Dev

将默认值添加到C#中的“数据表”列后,列行值显示为空白

来自分类Dev

Sqlite将数据库合并为一个具有唯一值的数据库,并保留前向键关系

来自分类Dev

提取数据库后从表中消除重复的值

来自分类Dev

提取数据库后从表中消除重复的值

来自分类Dev

保存后数据库中的输入=“日期”无效值

来自分类Dev

创建新对象后如何获取对象的默认值?

来自分类Dev

从数据库中获取在laravel中具有特定列值的所有行

来自分类Dev

如何显示数据库中的默认值

来自分类Dev

将列中具有相同值的行合并为数据框中的单行

来自分类Dev

合并后,用于合并丢失的列

来自分类Dev

Hibernate引发SQLException“ id字段没有默认值”

来自分类Dev

Hibernate / SQLException:字段没有默认值

来自分类Dev

在查询映射期间为Hibernate中的列设置默认值

来自分类Dev

在Hibernate中持久保存后获取数据库生成的ID

来自分类Dev

在Hibernate中持久保存后获取数据库生成的ID

来自分类Dev

更改列默认值后是否需要重建索引?

Related 相关文章

  1. 1

    带有@Embedded的数据库中的Hibernate空值

  2. 2

    具有默认值的Android Listview数据库

  3. 3

    更改后获取输入的默认值

  4. 4

    具有默认值的text_field无法保存到Rails中的数据库

  5. 5

    如何在OpenERP7中使数据库字段具有默认值?

  6. 6

    停止Spring Jpa + Hibernate重写联接数据库中的值

  7. 7

    Hibernate / JPA,字段“ accreditation_company_id”没有默认值错误

  8. 8

    从数据库获取后如何更改属性值

  9. 9

    从数据库值中获取下拉文本作为选定的默认值

  10. 10

    获取选择框以使用mysql数据库中的最新值设置默认值

  11. 11

    Ruby 2.1.0具有默认值后重新分配实例变量

  12. 12

    从具有合并单元格的Excel文件中获取数据并存储在MySQL数据库中

  13. 13

    无法获取数据库默认值,返回NoSuchObjectException

  14. 14

    将默认值添加到C#中的“数据表”列后,列行值显示为空白

  15. 15

    Sqlite将数据库合并为一个具有唯一值的数据库,并保留前向键关系

  16. 16

    提取数据库后从表中消除重复的值

  17. 17

    提取数据库后从表中消除重复的值

  18. 18

    保存后数据库中的输入=“日期”无效值

  19. 19

    创建新对象后如何获取对象的默认值?

  20. 20

    从数据库中获取在laravel中具有特定列值的所有行

  21. 21

    如何显示数据库中的默认值

  22. 22

    将列中具有相同值的行合并为数据框中的单行

  23. 23

    合并后,用于合并丢失的列

  24. 24

    Hibernate引发SQLException“ id字段没有默认值”

  25. 25

    Hibernate / SQLException:字段没有默认值

  26. 26

    在查询映射期间为Hibernate中的列设置默认值

  27. 27

    在Hibernate中持久保存后获取数据库生成的ID

  28. 28

    在Hibernate中持久保存后获取数据库生成的ID

  29. 29

    更改列默认值后是否需要重建索引?

热门标签

归档