首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PrimaryKeyJoinColumn不支持JPA / Hibernate CreationTimestamp

PrimaryKeyJoinColumn是JPA(Java持久化API)和Hibernate框架中的一个注解,用于指定实体类之间的关联关系。它用于在关联表中创建一个主键外键关联,将一个实体类的主键作为另一个实体类的外键。

然而,CreationTimestamp注解不支持在PrimaryKeyJoinColumn中使用。CreationTimestamp是Hibernate提供的另一个注解,用于在实体类中自动设置创建时间戳。它通常用于记录实体对象的创建时间。

在JPA / Hibernate中,如果想要同时使用PrimaryKeyJoinColumn和CreationTimestamp,可以通过以下方式实现:

  1. 使用@JoinColumn注解:可以使用@JoinColumn注解来替代PrimaryKeyJoinColumn注解,它可以在关联表中创建一个外键列,并指定外键的名称、引用列等属性。同时,可以在实体类中使用CreationTimestamp注解来设置创建时间戳。

示例代码如下:

代码语言:txt
复制
@Entity
public class EntityA {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @CreationTimestamp
    private LocalDateTime createdAt;

    // Other fields and getters/setters
}

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

    @ManyToOne
    @JoinColumn(name = "entity_a_id")
    private EntityA entityA;

    // Other fields and getters/setters
}

在上述示例中,EntityA和EntityB之间的关联关系通过@JoinColumn注解建立,创建时间戳通过@CreationTimestamp注解设置。

  1. 使用@MapsId注解:另一种方法是使用@MapsId注解,它可以将实体类的主键属性映射到关联实体类的外键属性上。同时,可以在实体类中使用CreationTimestamp注解来设置创建时间戳。

示例代码如下:

代码语言:txt
复制
@Entity
public class EntityA {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(mappedBy = "entityA")
    private EntityB entityB;

    @CreationTimestamp
    private LocalDateTime createdAt;

    // Other fields and getters/setters
}

@Entity
public class EntityB {
    @Id
    private Long id;

    @OneToOne
    @MapsId
    private EntityA entityA;

    // Other fields and getters/setters
}

在上述示例中,EntityA和EntityB之间的关联关系通过@OneToOne和@MapsId注解建立,创建时间戳通过@CreationTimestamp注解设置。

总结:PrimaryKeyJoinColumn不支持同时使用CreationTimestamp注解。如果需要在JPA / Hibernate中同时使用这两个注解,可以使用@JoinColumn注解或@MapsId注解来替代PrimaryKeyJoinColumn注解,并结合CreationTimestamp注解来实现相应的功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

放弃MyBatis!我选择 JDBCTemplate!

因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template。 Hibernate和Mybatis是使用最多的两个主流框架,而JOOQ、Ebean等小众框架则知道的人不多,但也有很多独特的优点;而JPA则是一组Java持久层Api的规范,Spring Data JPA是JPA Repository的实现,本来和Hibernate、Mybatis、JOOQ之类的框架不在同一个层次上,但引入Spring Data JPA之类框架之后,我们会直接使用JPA的API查询更新数据库,就像我们使用Mybatis一样,所以这里也把JPA和其他框架放在一起进行比较。 同样,JDBC和其他框架也在同一层次,位于所有持久框架的底层,但我们有时候也会直接在项目中使用JDBC,而Spring JDBC Template部分消除了使用JDBC的繁琐细节,降低了使用成本,使得我们更加愿意在项目中直接使用JDBC。

01

Quarkus的Spring扩展,快速改造Spring项目(14)

博主上个礼拜,已经实现了quarkus的native image应用的上线,经过两天的监控下来,一切运行指标良好,就是内存升到了100M了,这个后续继续跟进观察。今天聊点老的spring应用改造成quarkus的问题。一个新的框架是否可以顺利的在一个公司落地,除了本身优秀的设计和优异的性能外,框架的生态和上手的难度以及对现有框架的兼容性都是非常重要的考量因素,在quarkus之前,使用最广泛的web框架就是spring webmvc框架了,数据访问层用的多的也是spring data jpa等。quarkus充分考虑了这种spring用户的需求,官方出品了多个针对spring环境的迁移扩展包,有了这些spring扩展,可以非常轻松的从spring应用迁移到quarkus平台上来。

05

Hibernate缓存配置

一级缓存 Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法 及调用查询接口list,filter,iterate时,如session缓存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中, 当Session关闭的时候该Session所管理的一级缓存也会立即被清除 Hibernate的一级缓存是Session所内置的,不能被卸载,也不能进行任何配置 二级缓存配置: 1、首先要打开二级缓存,在hibernate.cfg.xml中添加如下配置: <property name="hibernate.cache.use_second_level_cache">true</property> 2、Hibernate的二级缓存使用第三方的缓存工具来实现,所以我们需要指定Hibernate使用哪个 缓存工具。如下配置指定Hibernate使用EhCache缓存工具。 <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 3、Hibernate在默认情况下并不会对所有实体对象进行缓,所以,我们需要指定缓存哪些对象, 在实体对象的映射文件中(相应的<class>标签内部),添加如下配置: <cache usage="read-only"/> usage="read-only"是“只读”缓存策略。 注意,这个<cache>标签只能放在<class>标签的内部,而且必须处在<id>标签的前面!!! 这个<cache>标签放在哪些<class>标签下面,就说明会多这些类的对象进行缓存 4、对于第3步,有一个可选的方案是在hibernate.cfg.xml文件中指定哪些类的对象需要缓存, 而不需要使用<cache>标签来指定。如: 在hibernate.cfg.xml中添加如下配置: <class-cache class="com.bjsxt.hibernate.Classes" usage="read-only" /> 注意,这个<class-cache>标签必须放在<mapping>标签的后面!! Hibernate缓存配置 _____________________________________________________________________________________ Hibernate的缓存分为:   一级缓存:在Session级别的,在Session关闭的时候,一级缓存就失效了。   二级缓存:在SessionFactory级别的,它可以使用不同的缓存实现,如EhCache、JBossCache、OsCache等。 缓存的注释写法如下,加在Entity的java类上:   @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 缓存的方式有四种,分别为:   CacheConcurrencyStrategy.NONE   CacheConcurrencyStrategy.READ_ONLY,只读模式,在此模式下,如果对数据进行更新操作,会有异常;   CacheConcurrencyStrategy.READ_WRITE,读写模式在更新缓存的时候会把缓存里面的数据换成一个锁,其它事务如果去取相应的缓存数据,发现被锁了,直接就去数据库查询;   CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不严格的读写模式则不会的缓存数据加锁;   CacheConcurrencyStrategy.TRANSACTIONAL,事务模式指缓存支持事务,当事务回滚时,缓存也能回滚,只支持JTA环境。 另外还有如下注意事项:   1、查询缓存需要在Query的相应方法执行前加上这么一句:   query.setCacheable(true);   在使用Hibernate时,获得的query有setCacheable方法,可以设置使用缓存,但当使用JPA时,javax.persistence.Query并没有setCacheable方法,此时如果JPA的实现是Hibernate时,可以将其进行如下转化,再调用setCacheable方法(如果JPA的实现是其它ORMAP框架,就不知道怎么做了)。 if (query

01
领券