Tag: hibernate

DataJPATest Junit方法命名和NullPointerExceptions

我正在使用SpringBoot / Kotlin / JPA / Hibernate / Junit,并且拥有JpaServiceTest类,可以执行与单个实体有关的存储库方法。 JpaService类的方法名遵循约定findByXXXXId , findAll , addXXXX , addXXXX和deleteXXXX 。 为了保持一致性,我使用相同的约定为JpaTest类中的方法命名。 我的JpaTest类有两个findById场景,其中’Null’预期是另一个返回映射实体的地方。 我的应用程序按预期方式工作,但是我的测试类在findById方案上失败,这个方案有望返回一个有效的实体。 The service class @Service(“MyService”) @Transactional internal class JpaMyService(val MyRepo: MyRepository) : MyService { val log = LoggerFactory.getLogger(“MyService”) override fun findByMyId(MyId: Long): MyDto? { log.debug(“Retrieving My: {}”, MyId) return MyRepo.findOne(MyId)?.toDto() } override fun findAllMys(): List { […]

Kotlin&Hibernate IllegalArgumentException:无法将字符串字段Job.name设置为Job

我试图坚持一个单一的对象与hibernate到Postgres数据库。 这个类看起来像这样: @Entity @Table(name = “jobs”) data class Job( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Int? = 0, var name: String? = “” ) 我用下面的代码创建一个hibernate会话: fun createSessionFactory(targetClass: Class): SessionFactory? { val registryBuilder = StandardServiceRegistryBuilder() if (sessionFactory == null) { val configuration = hashMapOf( Environment.DRIVER to “org.postgresql.Driver”, Environment.URL to “jdbc:postgresql://localhost:5432/testdb”, Environment.DIALECT to “org.hibernate.dialect.PostgreSQL9Dialect”, Environment.USER to “user”, […]

与JPA Kotlin:默认构造函数地狱

按照JPA的要求,@ @Entity类应该有一个默认的(非arg)构造函数来从数据库中检索对象时实例化对象。 在Kotlin中,属性在主构造函数中声明非常方便,如下例所示: class Person(val name: String, val age: Int) { /* … */ } 但是,当非参数构造函数被声明为次要构造函数时,它需要传递主构造函数的值,所以需要一些有效的值,如下所示: @Entity class Person(val name: String, val age: Int) { private constructor(): this(“”, 0) } 如果这些属性比String和Int有更复杂的types,并且它们是不可空的,那么为它们提供值看起来完全不好,特别是当主构造函数和init块中有很多代码,并且参数是积极使用 – 当它们被重新分配时,大部分代码将被重新执行。 而且, val -properties不能在构造函数执行后重新分配,所以不可变性也会丢失。 所以问题是:Kotlin代码如何适应与JPA无代码重复,选择“魔术”的初始值和不可变性的损失? PS除了JPA,Hibernate是否可以构造没有默认构造函数的对象呢?

Spring JPA查询总是使用序列扫描而不是索引扫描

我有一个简单的查询 @Query(value = “select * from some_table where consumer_id=:consumerId and store_id=:storeId and cancelled_at is null”, nativeQuery = true) fun checkIfNewConsumer(consumerId: BigInteger, storeId: BigInteger): List 当我运行查询时,直接对超过3000万行的表进行解释 Index Scan using select_index on some_table (cost=0.56..8.59 rows=1 width=86) (actual time=0.015..0.015 rows=0 loops=1) Index Cond: ((consumer_id = 1234) AND (store_id = 4) AND (cancelled_at IS NULL)) Planning time: 0.130 ms […]

Kotlin与JPA / Hibernate:没有“开放”没有懒加载?

大多数Kotlin JPA示例代码看起来像这样 class Person(val name: String, val age: Int) { /* … */ } 甚至 data class Person(val name: String=””, val age: Int=0) { /* … */ } 现在,“ Hibernate用户指南”和其他几个ORM都指出,他们通常要创建代理或扩展模型类,但要允许在Kotlin中将类明确定义为open 。 这对于数据类来说目前是不可能的,从我自己的经验来看,大多数人在Kotlin编写JPA实体时并没有考虑这个问题。 所以,来我的问题(毕竟这是stackoverflow),是否足够 open class Person(val name: String, val age: Int) { /* … */ } 或者我们真的不得不这样做 open class Person(open val name: String, open val […]

Spring Hibernate在初始化数据库时不能添加外键约束

当Spring初始化时,我得到以下exception: https : //pastebin.com/abMuS4v3 这里是发生exception的kotlin代码,它是实体构造函数的一部分: @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(joinColumns = [(JoinColumn(name = “id”))]) @Column(name = “authenticated_factor”) val authenticatedFactors: MutableSet = hashSetOf(), CredentialType是一个枚举类。 有趣的是,这个exception发生在MySQL上,但不在MariaDB上。 提前致谢!

Kotlin:Collection既没有genericstypes,也没有OneToMany.targetEntity()

我有一个枚举类RoleType public enum RoleType { SYSTEM_ADMIN, PROJECT_ADMIN, USER; } 在我的User实体类,我有以下映射的枚举集合。 这是Java代码: @JsonProperty @ElementCollection @Enumerated(EnumType.STRING) @CollectionTable(name = “user_role”, joinColumns = @JoinColumn(name = “user_id”)) private Set roles; 我把这个User实体类转换成Kotlin ,这里是代码: @JsonProperty @Enumerated(EnumType.STRING) @ElementCollection @CollectionTable(name = “user_role”, joinColumns = arrayOf(JoinColumn(name = “user_id”))) var roles: kotlin.collections.Set? = null 转换后,hibernate抛出以下exception: Collection has neither generic type or OneToMany.targetEntity() defined: com.abmodel.User.roles 在Java之前它工作正常。 我也尝试像这样在@ElementCollection添加targetClass […]

Kotlin,JPA和@Transient

我有一个实体类,我已经从Java迁移到Kotlin。 其中一个属性( inetAddress )用@Transient注释,以防止它被持久化到关系数据库。 但是,JPA(Hibernate实现)没有看到这个注释,并把它放在数据库中,因为它是自己的字段。 当这个类用Java编写时,这一切都可以正常工作。 有谁知道如何正确注释这个Kotlin类,以便JPA / Hibernate将看到@Transient注释,而不是将inetAddress属性放在数据库中? package infr.audio.model import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty import infr.audio.messages.InetAddressWrapper import java.io.Serializable import java.net.InetAddress import javax.persistence.Column import javax.persistence.Entity import javax.persistence.GeneratedValue import javax.persistence.Id import javax.persistence.NamedQueries import javax.persistence.NamedQuery import javax.persistence.Table @Entity @Table(name = “DIS_JOCKEY”) @NamedQueries(NamedQuery(name = “DisJockeyInfo.find”, query = “SELECT m FROM DisJockeyInfo m”), NamedQuery(name = “DisJockeyInfo.findByReservationId”, query = “SELECT […]

如何在hibernate-validator中设置一个可选的/可空的属性?

我发现这个实现 ,基本上做我想要的。 @ConstraintComposition(OR) @NotBlank @Null @ReportAsSingleViolation @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Constraint(validatedBy = {}) public @interface NullOrNotBlank { String message() default "{org.hibernate.validator.constraints.NullOrNotBlank.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } 和我一样使用它 @field:NullOrNotBlank @field:Size(max = 50) var middleName: String? = null, 我也试过了 @field:NullOrNotBlank @field:Size(max = 50) @field:Column(nullable = true) var middleName: String? […]

指定索引(非唯一键)使用JPA

如何定义一个字段,例如使用JPA注释将email定义为索引。 我们在email上需要一个非唯一的密钥,因为每天在这个字段上有几百万个查询,而且没有密钥有点慢。 @Entity @Table(name="person", uniqueConstraints=@UniqueConstraint(columnNames={"code", "uid"})) public class Person { // Unique on code and uid public String code; public String uid; public String username; public String name; public String email; } 我已经看到一个冬眠特定的注释,但我试图避免供应商的具体解决方案,因为我们仍然决定休眠和数据核心之间。 更新: 从JPA 2.1开始,你可以做到这一点。 请参阅: 此位置不允许使用注释@Index