同じJPAエンティティを他のJPAエンティティに複数回マッピングする

フロエホ

first_userとsecond_userを介して、ユーザーをリレーションシップにマップし、リレーションシップのステータスを追跡できるようにします。より良いアプローチがあるかもしれません、そして私はどんな役に立つ提案でも喜んで考えます。

私が固執しようとすると、主な問題が発生します。データベースを確認すると、関係の「関係」側は正常に機能しているように見えますが、テーブルuser_relationshipが機能していません。

それで、問題は基本的に、なぜユーザーの関係の持続が機能しないのかということです。

編集:私はこれが複製を提案されている投稿を見ました。受け入れられた回答では、Sym-symは関係を修正することを指し、例を提供します。例を調べましたが、関係のOneToMany側で見られる唯一の違いは、mappedBy属性です。関係の反対側に2つのManyToOneがあるため、どちらをマップするかはよくわかりません。firstPartyまたはおそらくsecondPartyでマップし、もう一方はどうなりますか?

これは私がこれまでに得たものです:

@Entity
@Table(name = "user")
data class User(

    @Id
    @GeneratedValue(generator = "my_user_sequence")
    @SequenceGenerator(name = "my_user_sequence", sequenceName = "user_sequence", allocationSize = 1)
    val id: Long = -1,

    @JsonIgnore
    @OneToOne(mappedBy = "user", cascade = [CascadeType.ALL], optional = false)
    var preferences: Preferences? = null,

    @OneToMany(cascade = [CascadeType.ALL])
    var relationships: MutableSet<Relationship> = mutableSetOf(),

    @Column(name = "facebook_id")
    var fbId: String = "",
    var email: String? = null,

    var registrationToken: String = "",

    var birthday: LocalDate? = null,

    val created: LocalDateTime = LocalDateTime.now(Clock.systemUTC()),

    @Column(name = "phone_number")
    var phoneNumber: String = "",
    var password: String? = null,

    @Column(name = "first_name")
    var firstName: String? = null,

    @Column(name = "show_location")
    var showLocation: Boolean = true,

    @Column(name = "show_age")
    var showAge: Boolean = true,

    @Column(name = "picture_url")
    var pictureUrl: String? = null,

    @Column(name = "notify_message")
    var notifyMessage: Boolean = true,

    @Column(name = "notify_relationships")
    var notifyRelationship: Boolean = true
)

これは関係クラスです:

@Entity
@Table(name = "relationship")
data class Relationship(

        @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "joyship_relationship_sequence")
    @SequenceGenerator(name = "joyship_relationship_sequence", sequenceName = "relationship_sequence", allocationSize = 1)
    val id: Long = -1,

    @ManyToOne(cascade = [])
    @JoinTable(name = "first_party")
    val firstParty: User,

    @ManyToOne(cascade = [])
    @JoinTable(name = "second_party")
    val secondParty: User,

    // Id of user is key for relationship_status of user with smaller number on id
    @Enumerated(EnumType.STRING)
    @Column(name = "first_status")
    var firstStatus: RelationshipStatus = NOT_INTRODUCED,

    // Id of user is key for relationship_status of user with bigger number on id
    @Enumerated(EnumType.STRING)
    @Column(name = "second_status")
    var secondStatus: RelationshipStatus = NOT_INTRODUCED,

    // Changes when relationship_status_1 or *_2 changes
    // (Strongest of the statuses dictates common_relationship_status)
    @Enumerated(EnumType.STRING)
    @Column(name = "common_relationship_status")
    var commonRelationshipStatus: RelationshipStatus = NOT_INTRODUCED,

    @Column(name = "relative_distance")
    var relativeDistance: Int = 160,

    @Column
    val established: LocalDateTime = LocalDateTime.now(Clock.systemUTC()),

    @OneToOne(mappedBy = "relationship", cascade = [CascadeType.ALL], optional = false)
    @JoinColumn(name = "last_interaction")
    var lastInteraction: Interaction? = null,

    @Column
    var lastInteractionTime: LocalDateTime = LocalDateTime.now(Clock.systemUTC()))

私が関係を持ってユーザーを永続化しようとすると、それは一貫して私にこれを与えます:

    javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: co.joyship.server.fraendurheim.models.Relationship

    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:814)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:774)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener$1.cascade(JpaPersistEventListener.java:80)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:467)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:392)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:193)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:500)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:432)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:395)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:193)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:126)
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:445)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:281)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:783)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:768)
    at org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager.persist(TestEntityManager.java:93)
    at co.joyship.server.fraendurheim.RelationshipRepositoryTest.whenRequestingUserRelationshipFromDBReturnCorrectPagination(RelationshipRepositoryTest.kt:64)
    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)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: co.joyship.server.fraendurheim.models.Relationship
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:124)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:807)
    ... 52 more
フロエホ

誰かが私と同じ状況にいることに気付いた場合:このアプローチを試さないでください。それは間の双方向の関係を作成するには、限り、私の裁判が示すように、可能ではない2 1つのエンティティで@ManyToOneとちょうど1他のエンティティで@OneToManyを。

これまでの特定のケースで見つかった2つの解決策は、次のいずれかです。

  • エンティティの2つの別々のフィールドを相互マップします1つのオブジェクトの1つのフィールドから、他のオブジェクトの2つのフィールドへ。
  • または、1つのフィールド@ManyToManyでオブジェクトをマップし、誰がどのステータスを所有しているかを判断する別の方法を見つけます(最大のIDなど)

この参照を使用して、@ OneToManyの関係を正しくしました

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じタイプの複数のエンティティをマッピングするHibernate JPA

分類Dev

JPA-同じエンティティを持つ列のマッピング

分類Dev

JPA ManyToManyマッピングの問題(同じエンティティを別のエンティティにマッピングできない)

分類Dev

Spring Boot JPA:1つのエンティティを同じ列を持つ複数の(たくさんの)テーブルにマッピングする

分類Dev

実行時にJPAでエンティティのマッピングテーブル名を取得する方法

分類Dev

JPAエンティティのマッピング

分類Dev

弱いエンティティをJPAでマッピングする

分類Dev

異なるエンティティのJPA管理マッピングエラー

分類Dev

JPA-2つの@ManyToOneを同じ親エンティティにマップする方法

分類Dev

JPAエンティティをマップに変換する

分類Dev

JPA での複合外部キーによるエンティティのマッピング

分類Dev

JPA / Hibernate同じエンティティの複数の表現

分類Dev

データベースルックアップをjpaエンティティにマッピングする

分類Dev

Hibernate / JPA:エンティティを異なるデータベースにマッピングする

分類Dev

非エンティティDTOにJPAマッピングネイティブクエリの結果

分類Dev

JPAでこれらのエンティティをマッピングする方法

分類Dev

既存のJPAエンティティをPicketLinkにマップする方法

分類Dev

JPAエンティティの複製

分類Dev

JPAエンティティの継承階層へのマッピング

分類Dev

CQRSでのJPAエンティティとDTO間のマッピング

分類Dev

Swagger OpenAPIモデルとJPAエンティティ間のマッピング

分類Dev

エンティティのマッピングでJPA繰り返し列

分類Dev

複数のエンティティを1つのテーブルにマッピングする

分類Dev

JPA基準:ルートを複数のエンティティサブクラスにダウンキャストし、同じリンクエンティティのナチュラルIDでフィルタリングする

分類Dev

jpaエンティティマッピングカップルテーブル

分類Dev

JPA:複数のエンティティを返すクエリ

分類Dev

JPAエンティティマネージャーで特定のエンティティ/行を更新する方法

分類Dev

JPA:同じエンティティ上のmanyToManyの関係

分類Dev

他の2つのエンティティマッピングに基づいて関連付けられているJPAエンティティマッピング

Related 関連記事

  1. 1

    同じタイプの複数のエンティティをマッピングするHibernate JPA

  2. 2

    JPA-同じエンティティを持つ列のマッピング

  3. 3

    JPA ManyToManyマッピングの問題(同じエンティティを別のエンティティにマッピングできない)

  4. 4

    Spring Boot JPA:1つのエンティティを同じ列を持つ複数の(たくさんの)テーブルにマッピングする

  5. 5

    実行時にJPAでエンティティのマッピングテーブル名を取得する方法

  6. 6

    JPAエンティティのマッピング

  7. 7

    弱いエンティティをJPAでマッピングする

  8. 8

    異なるエンティティのJPA管理マッピングエラー

  9. 9

    JPA-2つの@ManyToOneを同じ親エンティティにマップする方法

  10. 10

    JPAエンティティをマップに変換する

  11. 11

    JPA での複合外部キーによるエンティティのマッピング

  12. 12

    JPA / Hibernate同じエンティティの複数の表現

  13. 13

    データベースルックアップをjpaエンティティにマッピングする

  14. 14

    Hibernate / JPA:エンティティを異なるデータベースにマッピングする

  15. 15

    非エンティティDTOにJPAマッピングネイティブクエリの結果

  16. 16

    JPAでこれらのエンティティをマッピングする方法

  17. 17

    既存のJPAエンティティをPicketLinkにマップする方法

  18. 18

    JPAエンティティの複製

  19. 19

    JPAエンティティの継承階層へのマッピング

  20. 20

    CQRSでのJPAエンティティとDTO間のマッピング

  21. 21

    Swagger OpenAPIモデルとJPAエンティティ間のマッピング

  22. 22

    エンティティのマッピングでJPA繰り返し列

  23. 23

    複数のエンティティを1つのテーブルにマッピングする

  24. 24

    JPA基準:ルートを複数のエンティティサブクラスにダウンキャストし、同じリンクエンティティのナチュラルIDでフィルタリングする

  25. 25

    jpaエンティティマッピングカップルテーブル

  26. 26

    JPA:複数のエンティティを返すクエリ

  27. 27

    JPAエンティティマネージャーで特定のエンティティ/行を更新する方法

  28. 28

    JPA:同じエンティティ上のmanyToManyの関係

  29. 29

    他の2つのエンティティマッピングに基づいて関連付けられているJPAエンティティマッピング

ホットタグ

アーカイブ