1

エンティティの 1 つに問題があります。

Glassfish アクセス管理用の 3 つのテーブル (UserAccount、UserRole、Role) と、「ManyToMany」によって相互にマッピングされた 2 つのエンティティ UserAccount と Role があります。

UserAccount のロールを変更するには、UserAccount の setRoles() メソッドを使用して、選択したロールの新しいリストを適用します。新しい役割を追加すると、すべてが正常に機能します。ステートメントは正しいです。

INSERT INTO UserRole (Role_roleName, UserAccount_email,
                             UserAccount_Account_accountId) 
    VALUES ('Client', 'email@example.com', 1)

しかし、リストからアイテムを削除すると、結合テーブル内の削除されたエントリも削除されます。予想どおり、送信されたクエリがありますが、メール列が「null」に設定されています。

DELETE FROM UserRole WHERE ((Role_roleName = 'Administrator') 
    AND ((UserAccount_Account_accountId = 1) AND (UserAccount_email = null)))

この列が null に設定されている理由を知っている人はいますか? データベースへのマージの直後と直前に userAccount.getEmail() でメールを出力すると、メールアドレスが返されます...

どんな助けでも大歓迎です。

ありがとう、マヌエル

セットアップ: コンテナ: Glassfish 3.1.2 JPA: Eclipse Persistence Services - 2.3.2.v20111125-r10461

UserAccount エンティティ:

@Entity
@Table(name="UserAccount")
@PrimaryKeyJoinColumn(name = "Account_accountId")
public class UserAccount extends Account implements Serializable {
  private static final long serialVersionUID = 1L;

  private String password;

  //bi-directional one-to-one association to Account
  @OneToOne
  @JoinColumn(name="Account_accountId")
  private Account account;

  @Column(name="email")
  private String email;

  //bi-directional many-to-many association to Role
  @ManyToMany
  @JoinTable(
    name="UserRole"
    ,

    joinColumns={

        @JoinColumn(name="UserAccount_email", referencedColumnName="email"),
        @JoinColumn(name="UserAccount_Account_accountId", referencedColumnName="Account_accountId")
        }
    , inverseJoinColumns={
        @JoinColumn(name="Role_roleName")
        }
    )
  private List<Role> roles;       
       //getter and setters

アカウント エンティティ

@Entity
@Table(name="Account")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Account implements Serializable {
   private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   private int accountId;

   private boolean active;

   private String address;

   private String dtype;

   private String firstname;

   private String handy;

   private String name;

   private String tel;

       //getter and setters

ロール エンティティ:

@Entity
@Table(name="Role")
public class Role implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private String roleName;

    @Lob
    private String roleDescription;

    //bi-directional many-to-many association to UserAccount
    @ManyToMany(mappedBy="roles")
    private List<UserAccount> userAccounts;

    //getter and setters 
4

1 に答える 1