【问题标题】:EclipseLink: Value of Column is null while Deleting in ManyToMany-RelationshipEclipseLink:在多对多关系中删除时列的值为空
【发布时间】:2013-04-20 07:50:19
【问题描述】:

我的一个实体有问题。

Glassfish 访问管理有 3 个表(UserAccount、UserRole、Role)和两个实体 UserAccount 和 Role,通过“ManyToMany”相互映射。

要更改 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)))

有人知道为什么此列设置为空吗?当我在合并到数据库之后和之前使用 userAccount.getEmail() 输出电子邮件时,它会返回电子邮件地址...

非常感谢任何帮助。

谢谢,曼努埃尔

设置: 容器:Glassfish 3.1.2 JPA:Eclipse 持久性服务 - 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 

【问题讨论】:

  • 你是怎么解决这个问题的?
  • 不幸的是我无法解决它......
  • 一旦我找到解决方案我会告诉你的。

标签: jakarta-ee jpa glassfish eclipselink


【解决方案1】:

您的模型似乎很混乱。

如果UserAccount是Account的子类,那么它就是一个Account,它不应该有一个OneToOne来记账吗?

电子邮件不是帐户 ID 的一部分,因此不能,也不需要作为连接表中的连接列。您只需要帐户 ID。

【讨论】:

  • 是的,我知道加入并不是真的需要电子邮件,但问题是 glassfish 的身份验证需要角色名称旁边的用户名(在这种情况下,id 是无用的)。所以我还必须用用户名制作第二列。所以我尝试使用这两个值进行连接,因此 JPA 插入了 ID 和电子邮件,以便 Glassfish 的身份验证系统可以正确使用它。但这并没有像我希望的那样工作。
猜你喜欢
  • 2012-03-31
  • 2013-11-21
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多