2017-06-06 5 views
0

JPAを使用しており、EntityのいずれかにEmbeddedIdを使用しています。埋め込みIDを格納する新しい主キーIDを取得するために強制的に実行する

の表は、のように怒鳴るです:ロールテーブル用

Role: 
+-----------------------------+ 
| roleId | name | discription | 
+-----------------------------+ 


Rights: 
+-----------------------------+ 
| rightId | name | discription| 
+-----------------------------+ 

rightrole 
+--------------------------------------+ 
| roleId | rightId | some other column | 
+--------------------------------------+ 

エンティティは次のとおりです。rightroleテーブルの

@Entity 
@Table(name = "role") 
public class Role { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @NotNull 
    @Column(nullable = false) 
    private Long roleID; 


    @OneToMany(cascade = CascadeType.ALL, mappedBy = "role", fetch = FetchType.LAZY) 
    private List<RightRole> rightRoleList; 

....... 
} 

エンティティは次のとおりです。

@Entity 
    @Table(name = "rightrole") 
    public class RightRole extends BaseEntity<RightRolePK> { 

     private static final long serialVersionUID = 1L; 

     @EmbeddedId 
     protected RightRolePK rightRolePK; 


     @JoinColumn(name = "roleID", referencedColumnName = "roleID", insertable = false, updatable = false) 
     @ManyToOne(fetch = FetchType.LAZY) 
     private Role role; 

     @JoinColumn(name = "rightID", referencedColumnName = "rightID", insertable = false, updatable = false) 
     @ManyToOne(fetch = FetchType.LAZY) 
     private Right right; 

     ...... 
    } 


    @Embeddable 
    public class RightRolePK implements Serializable { 
    private static final long serialVersionUID = 1L; 

     @Basic(optional = false) 
     @NotNull 
     @Column(nullable = false) 
     private long roleID; 

     @Basic(optional = false) 
     @NotNull 
     @Column(nullable = false) 
    private long rightID; 

    ..... 

} 

私の問題はいつでもありますしたい新しいrolerightsで作成してから最初にstore(persist)roleオブジェクトを作成してから、flushを作成して、新規作成する必要があります。id役割そして、それをrightroleエンティティのオブジェクトに入れることができます。

ロールオブジェクトにrightroleのリストを設定して、それを一度に永続させることができる方法はありますか。

このフラッシングケーシングはパフォーマンスボトルネックです。バルクインサートでは単一の単一オブジェクトを保持する必要があるためです。

Auto Generatedプライマリキーを使用しています。

+0

ロールには別の戦略を使用しますか? UUIDのように。あなたが複合識別情報を持っているこのハッピーな混乱の代わりに、RightRoleのために自動生成されたIDを持っていますか? –

+0

私たちはこの複合アイデンティティを使用している約35のテーブルを持っていますので、これを変更するには既存のアプリケーションで多くのコード変更が必要です。 –

+0

あなたが実際に単純化してそれを単純化することができれば、ちょうど良い提案です:rightRoleテーブルのIdのほかに追加の列なしでmanyToMany関係の@joinTableアノテーションを使用してください。 これは、2つのオブジェクトを作成して権利の権利リストを作成し、ロールを維持しながらこの問題を簡単にするでしょう – Zeromus

答えて

2

JPA 2.0は@MapsIdを追加することによって、この優れたをサポートするように拡張、派生IDを可能にします。同じ他のすべてを維持するが、使用して:

@Entity 
@Table(name = "rightrole") 
public class RightRole extends BaseEntity<RightRolePK> { 

    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    protected RightRolePK rightRolePK; 

    @MapsId("roleID") 
    @JoinColumn(name = "roleID", referencedColumnName = "roleID") 
    @ManyToOne(fetch = FetchType.LAZY) 
    private Role role; 

    @MapsId("rightID") 
    @JoinColumn(name = "rightID", referencedColumnName = "rightID", insertable = false, updatable = false) 
    @ManyToOne(fetch = FetchType.LAZY) 
    private Right right; 

    ...... 
} 

これはあなたのPKクラスでroleIDrightID属性内の値が関係マッピングによって制御されていることをJPAを教えてくれますし、それがでデータベースに同期した後、それを設定します参照からの主キー値そうでなければ主キーがないので、persistを呼び出す前に関係を設定しておく必要があります。

参照されたオブジェクトもコンポジットであっても機能します。

@Entity 
@Table(name = "wrong_right_role") 
public class WrongRightRole{ 
    @EmbeddedId 
    WrongRightRoleId wrongRightRoleId; 

    @MapsId("rightRoleID") 
    @JoinColumns({ 
     @JoinColumn(name = "roleID", referencedColumnName = "roleID"), 
     @JoinColumn(name = "rightID", referencedColumnName = "rightID") 
    }) 
    RightRole rightRole; 

} 

@Embeddable 
public class WrongRightRolePK implements Serializable { 
private static final long serialVersionUID = 1L; 

    private RightRoleID rightRoleID; 
    ..... 
} 

JPAはまた、あなたがオブジェクト内からrightRolePK embeddedIdを削除することができ、@ID注釈付きrightroleマッピングをマークすることができますし、使用:RightRoleを参照するために必要なものは、しかし代わりにロング値のRightRolePK使用します代わりにプライマリキークラスとして。

+0

私は、このエラーorg.eclipse.persistence.internal.descriptors.PersistenceObjectAttributeAccessor.setAttributeValueInObject org.eclipse.persistence.mappings.DatabaseMapping.setAttributeValueInObjectで(PersistenceObjectAttributeAccessor.java:46) (DatabaseMapping.java:1637) のを取得していますorg.eclipse.persistence.mappings.DatabaseMapping.setRealAttributeValueInObject(DatabaseMapping.java:1651) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.updateDerivedIds(UnitOfWorkImpl.java:5461) at org.eclipse.persistence.internal。セッション.UnitO fWorkImpl.registerNewObjectForPersist(UnitOfWor –

+0

)問題を解決してください。 –

1

あなたはこのようなあなたのエンティティを定義することができ@ManyToManyアノテーションを使用:

役割:

@Entity 
    @Table(name = "role") 
    public class Role { 

     private static final long serialVersionUID = 1L; 

     @Id 
     @GeneratedValue(strategy = GenerationType.IDENTITY) 
     @Basic(optional = false) 
     @NotNull 
     @Column(name = "ROLE_ID", nullable = false) 
     private Long roleID; 

     @JoinTable(name = "rightrole", 
       joinColumns = { 
        @JoinColumn(name = "roleID", referencedColumnName = "ROLE_ID")}, 
       inverseJoinColumns = { 
        @JoinColumn(name = "rightID", referencedColumnName = "RIGHT_ID")}) 
     @ManyToMany 
     private List<Right> rightList; 

    } 

をあなたはinverseJoinColumns@ManyToMany(cascade = {CascadeType.PERSIST})を記述する必要が子供が削除されます場合はそうでない場合は、あなたの親のデータが削除されます。

右:

@Entity 
@Table(name = "right") 
public class Right { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "RIGHT_ID",nullable = false) 
    private Long rightId; 

} 

あなたは、単にすることができます:

Role role = new Role(); 
    List<Right> rightList = new ArrayList<>(); 
    Right right1 = new Right(); 
    Right right2 = new Right(); 
    rightList.add(right1); 
    rightList.add(right2); 
    role.setRightList(rightList); 

とは(たとえ実体なし

rightroleテーブルに挿入するの世話をする@JoinTable注釈を持続限り、そのテーブルは、ロールと右のID列のみを持っているので)あなたはこのような何かを得るでしょうdb

役割:

id name  etc 
1 roleName etc 

右:

id name  etc 
1 rightName1 etc 
2 rightName2 etc 

rightrole:

roleId rightID 
1  1 
1  2 
+0

「右ロール」エンティティとは何ですか? –

+0

あなたのrightroleエンティティがroleIdとrightIdの間のリンクを定義しているだけの場合は、それを必要としません – Zeromus

+0

ソリューションは2つの(親の)カラムでのみ動作しますが、 'rightrole'テーブルに複数のカラムがある場合はどうなりますか? –

関連する問題