【问题标题】:Set field when Hibernate get object from database [duplicate]Hibernate从数据库中获取对象时设置字段[重复]
【发布时间】:2016-06-16 08:42:49
【问题描述】:

我使用 Hibernate 和 JPA

我有一些 POJO

public class Pojo {
  @Temporal(TemporalType.DATE)
  private Date date; 
  @Transient
  private long dLong;
  //other fields
  //getters and setters
}

当我从数据库中获取对象Pojo 时,我想将date 转换为dLong。 当我有对象时我可以这样做

Pojo pojo = repository.findFirst();
Date date = pojo.getDate();
long l = date.getTime();
pojo.setDLong(l);

但是当我打电话给repository.findFirst() 时我想这样做 我尝试使用 getter 和 setter 但没有成功。


编辑 热门内容是示例。对不起,但我无法用例子解释我的问题。现在我显示我的原始代码:

@Entity
public class Medicament {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    @Transient
    private long date;

    @Temporal(TemporalType.DATE)
    private Date dateExpiration;

    //getters and setters
}

接下来我有服务

@Service
public class MedicamentService {

    @Autowired
    private MedicamentRepositoryEntityGraph medicamentRepositoryEntityGraph;

    public Medicament findById(int id) {
        return medicamentRepositoryEntityGraph.getOne("select m from Medicament m where m.id="+id, "user", "disease");
    }
}

和存储库

@Repository
public class MedicamentRepositoryEntityGraph {

    @Autowired
    private EntityManager entityManager;

    public Medicament getOne(String query, String...param) {
        EntityGraph<Medicament> entityGraph = template(param);
        Medicament medicament = entityManager.createQuery(query, Medicament.class)
            .setHint("javax.persistence.loadgraph", entityGraph)
            .getSingleResult();
        return medicament;
    }

    private EntityGraph<Medicament> template(String... param) {
        EntityGraph<Medicament> entityGraph = entityManager.createEntityGraph(Medicament.class);
        entityGraph.addAttributeNodes(param);
        Map<String, Object> hints = new HashMap<String, Object>();
        hints.put("javax.persistence.fetchgraph", entityGraph);
        return entityGraph;
    }

}

我存储在数据库 dateExpiration 中,但是当我从数据库 'Medicament' 获取时,我想将 'dateExpiration' 转换为 long 'date',我使用来自服务 MedicamentService 的方法 findById

我尝试使用 getter 和 setter 但没有成功:

public void setDateExpiration(Date dateExpiration) {
        this.dateExpiration = dateExpiration;
        this.date = dateExpiration.getTime();
    }

【问题讨论】:

  • 你为什么不提供一个返回date.getTime()的getter?什么是repository.findFirst() - 自定义实现? Pojo 是实体还是通过 Hibernate 的构造函数语法创建的?
  • 我在主要问题中添加了一些信息。这是我在 stackoverflow 上的第一篇文章,我有疑问你收到我编辑我的问题的消息了吗?
  • 不,如果您编辑问题,则不会收到通知。
  • 顺便说一句,为什么你首先需要date 来返回long?使用 setter 失败的原因是什么?
  • @Thomas 我在我的视图(spring mvc + jsp)中使用'long',我将日期从long转换为MONTH YYYY,另一方面我将带有JSON的对象发送到android rest客户端并从long转换到日期并存储在 android sqllite 数据库中。我以为我可以在 getter 或 setter 中转换日期,但我不能(它不工作) - long 仍然是 0。

标签: java hibernate jpa spring-data-jpa


【解决方案1】:

Hibernate 可能会绕过设置器,但您可以将 dLong 设为“虚拟”属性,例如像这样:

public long getDate() {
  if( dateExpiration == null ) { 
    return -1;
  }

  return dateExpiration.getTime();
}

//Be careful with that and add some documentation
public void setDate(long date) {
  dateExpiration = new Date(date);
}

或者,您可以将date 映射到与dateExpiration 相同的列,并将insertable = false, updatable = false 添加到@Column,但您可能必须添加自定义用户类型才能将数据库日期转换为长日期。

【讨论】:

  • 我不能使用“虚拟”属性,因为我推开对象以查看我使用日期属性的位置。
  • @TomaszMolenda 根据您的框架,您仍然可以这样做,例如如果它基于 Java Beans 规范。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2010-10-20
  • 1970-01-01
  • 2011-05-13
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多