【问题标题】:OneToMany failing to save with EntityNotFoundOneToMany 无法使用 EntityNotFound 保存
【发布时间】:2020-01-02 23:05:43
【问题描述】:
Caused by: javax.persistence.EntityNotFoundException: Unable to find gateway.model.security.Role with id MONITOR
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:162)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:230)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:265)
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:124)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:92)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1257)
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1140)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:682)
    at org.hibernate.type.EntityType.resolve(EntityType.java:464)
    at org.hibernate.type.ManyToOneType.resolve(ManyToOneType.java:239)
    at org.hibernate.type.EntityType.resolve(EntityType.java:457)
    at org.hibernate.type.EntityType.replace(EntityType.java:358)
    at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:551)
    at org.hibernate.type.CollectionType.replace(CollectionType.java:714)
    at org.hibernate.type.AbstractType.replace(AbstractType.java:164)
    at org.hibernate.type.TypeHelper.replaceAssociations(TypeHelper.java:253)
    at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:419)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:240)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:301)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:170)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:901)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:887)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

这是标准的 spring security jdbc 表布局

create table users
(
    username          text    not null primary key,
    password          text    not null,
    rabbitmq_password text    not null,
    enabled           boolean not null
);
create table authorities
(
    username  text not null references users (username),
    authority text not null,
    unique (username, authority)
);

@Entity
@Table(name = "users")
data class User(
    @Id
    val username: String
) {
    lateinit var password: String
    @Column(name = "rabbitmq_password")
    lateinit var rabbitmqPassword: String
    var enabled: Boolean = false

    @OneToMany
    @JoinColumn( name="username")
    val roles: MutableSet<Role> = mutableSetOf()
}
@Entity
@Table( name="authorities")
class Role(
    @Id
    @Enumerated(EnumType.STRING)
    @Column( name="authority")
    val name: RoleName
)
enum class RoleName {
    MONITOR
}
interface UserRepository : CrudRepository<User, String>

当我在创建为 folows 后在 crud 存储库上调用 save 时会发生这种情况

            val user = User(serialNumber)
            user.password = mpuas.passwordEncoder.encode(password)
            user.rabbitmqPassword = mpuas.sha256.encode(password)
            user.roles.add(Role(RoleName.MONITOR))
repo.save(user)

我也尝试将角色名称设为字符串,但它仍然不想映射。 我做错了什么?

【问题讨论】:

    标签: hibernate jpa kotlin spring-data-jpa


    【解决方案1】:

    我认为这是因为角色不是一个完整的实体......现在可以这样做

        @ElementCollection
        @Enumerated(EnumType.STRING)
        @Column(name = "authority")
        @CollectionTable(name = "authorities", joinColumns = [JoinColumn(name = "username")])
        val roles: MutableSet<RoleName> = mutableSetOf()
    

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 2020-12-03
      • 2015-12-03
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多