エンティティの 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