Tag: JPA

JPA,Spring Data和Kotlin – 保存记录

从历史上看,我手动完成了Kotlin中的数据访问,并拥有一个我经常使用的特定数据结构: interface Id { val id: Int } data class Identity<ID : Id>( id: ID, version: Int ) data class Model<ID : Id, DATA>( identity: Identity<ID>, data: DATA ) 通过这样做,我可以有DAO看起来像这样: fun getUserById(id: UserId) : Model<UserId, UserData>() fun createUser(user: UserData) : Model<UserId, UserData>() 这一般运行良好,但意味着编写和测试DAO更费时间。 对于即将到来的项目,我正在考虑使用Spring Data JPA来做这件事 – 所以我可以将我的模型写成JPA实体,并让Spring Data完成所有与它们一起工作的繁重工作。 问题是 – 我无法用上面的数据处理一个简单的方法。 目前为止我所能看到的最好的方法是: 实体将ID存储为本地类型,并且手动获取器将其转换为丰富类型 默认的接口方法将丰富的类型和委托使用本机类型的版本 […]

尝试在Kotlin和Spring引导下使用JPA时出现BeanDefinitionParsingException

当我尝试使用springboot + JPA + kotlin + maven时,我得到这个异常 org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Bean method 'init' must not be private or final; change the method's modifiers to continue Offending resource: com.wirecard.kotlin.jpa.Application at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:70) at org.springframework.context.annotation.BeanMethod.validate(BeanMethod.java:50) at org.springframework.context.annotation.ConfigurationClass.validate(ConfigurationClass.java:219) at org.springframework.context.annotation.ConfigurationClassParser.validate(ConfigurationClassParser.java:528) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:307) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:239) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:254) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:94) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) at […]

Kotlin脚本无法从jar中访问META-INF资源(persistence.xml)

我有一个kotlin脚本.kts,它使用来自jar的META-INF资源(persistence.xm)。 我检查了META-INF是存在于jar(lib.jar) var emf: EntityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, props) 编译时出现这个错误: kotlinc -script template2.kts -cp“lib.jar:persist-0.0.1-dev.jar” javax.persistence.PersistenceException:没有EntityManager的持久性提供者 在Eclipse环境中使用主函数编译相同的代码 任何想法如何得到它适用于KTS? 谢谢

扩展Kotlin数据类以便与JPA一起使用?

Kotlin有一个Data类,可以自动实现equals和hashcode ,但是这些在JPA上下文中仍然不能自动使用 。 为了弥补这一点,我想知道如何扩展Data类型,以便分配一个“业务密钥”或id属性是final和non updatable并用作为业务密钥的UUID初始化,并有equals()和hashcode()方法使用该属性的实现。 我大致在想这样的事情: jpa class User(id: JpaId, val name: String, val age: Int) jpa class User(bid: JpaBid, val name: String, val age: Int) 而不是像这样使用Data类: data class User(bid: long, val name: String, val age: Int) 我们正在使用一种新的类jpa 。 我们还有两个新的类型, JpaId和JpaBid ,用来确定id属性是否应该是UUID或商业密钥,如ISBN号,sku等 如果使用JpaId类型,则会自动生成密钥。 如果使用JpaBid则应该在构造函数中提供该键。 这将确保只要JPA实体被构建,它就可以被唯一标识。 思考? 这是在Kotlin中做的非常直接的事情,还是我们需要在JVM烤架(Kotlin的新品牌)中起床?

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 […]

如何添加kotlin类到gradle JavaCompile任务

我用spring引导来使用kotlin和java来开发我的项目。 我的构建工具是gradle,一个任务定义如下: configurations { providedRuntime jpametamodel } dependencies { jpametamodel ('org.hibernate:hibernate-jpamodelgen:4.3.11.Final') } task generateMetaModel(type: JavaCompile, group: 'build', description: 'metamodel generate') { source = sourceSets.main.java classpath = configurations.compile + configurations.jpametamodel options.compilerArgs = ["-proc:only"] destinationDir = sourceSets.generated.java.srcDirs.iterator().next() doFirst { delete(sourceSets.generated.java.srcDirs) } } 这个任务适用于kotlin类,但是如果我添加kotlin类,任务不能通过抛出以下错误: Hibernate JPA 2 Static-Metamodel Generator 4.3.11.Final /…/src/main/java/com/app/web/rest/UserResource.java:18: Cannot find ….. import com.app.web.rest.dto.SimpleUser; ^ Symbol: […]

Kotlin JPA封装OneToMany

我正在使用Kotlin的JPA,并试图封装一个OneToMany关系的问题。 这是我可以很容易地在Java中实现,但由于Kotlin只有属性和类中没有字段有一些问题。 我有一个订单,一个订单有一个到多个订单项。 Order对象有一个LineItem的MutableList,但是get方法不应该返回一个可变列表,或者调用者可能修改的任何东西,因为这会破坏封装。 订单类应负责管理订单项的收集,并确保满足所有业务规则/验证。 这是我到目前为止的代码。 基本上我使用了一个支持属性,它是Order类将会改变的MutableList,然后是一个返回Iterable的transient属性, Collections.unmodifiableList(_lineItems)确保即使调用者获取列表,并将其转换为MutableList他们将无法修改它。 有没有更好的方法来执行封装和完整性。 也许我只是在设计和方法上过于防守。 理想情况下,没有人应该使用getter来获取和修改列表,但嘿它发生。 import java.util.* import javax.persistence.* @Entity @Table(name = "order") open class Order { @Id @GeneratedValue(strategy = GenerationType.AUTO) val id: Long? = null @Column(name = "first_name") lateinit var firstName: String @Column(name = "last_name") lateinit var lastName: String @OneToMany(cascade = arrayOf(CascadeType.ALL), fetch = FetchType.LAZY, mappedBy = "order") […]

与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有更复杂的类型,并且它们是不可空的,那么为它们提供值看起来完全不好,尤其是当主构造函数和init块中有很多代码,并且参数是积极使用 – 当它们被重新分配时,大部分代码将被重新执行。 而且, val -properties不能在构造函数执行后重新分配,所以不可变性也会丢失。 所以问题是:Kotlin代码如何适应与JPA无代码重复,选择“魔术”的初始值和不可变性的损失? PS除了JPA,Hibernate是否可以构造没有默认构造函数的对象呢?

Kotlin,JPA和布尔字段

我开始在我们的项目中引入kotlin,并将一些实体转换为kotlin,作为更大的重构的一部分。 我的实体有一个布尔活动属性: private boolean active = true; public boolean isActive() { return active; } public void setActive(final boolean active) { this.active = active; } 现在在kotlin这应该是: var isActive: Boolean = true 问题是,这样我不得不重构现有的查询,这不是什么大问题,但我期待着更平滑的过渡。 我可以做这样的事情: var active: Boolean = true val isActive: Boolean get()= active 但是感觉不对。 什么是最好的方法?