Java @ElementCollection不在我的表(JPA)中存储值

Java @ElementCollection不在我的表(JPA)中存储值,java,jpa,Java,Jpa,我的实体类中有一组长值。我希望此集合存储此类的特定实例的值。这是我的密码: @Entity @Table(name = "accounts") public class DefaultAccount implements Account { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) private Long id; @Column(name =

我的实体类中有一组
值。我希望此集合存储此类的特定实例的值。这是我的密码:

@Entity
@Table(name = "accounts")
public class DefaultAccount implements Account {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false)
private Long id;

@Column(name = "email", nullable = false, unique = true)
private String email;

@Column(name = "password", nullable = false)
private String password;

@ElementCollection
private Set<Long> managerAccounts = new HashSet<Long>();

public DefaultAccount(String email, String password) {
        Assert.hasText(email);
        Assert.hasText(password);
        this.email = email;
        this.password = password;
    }

public DefaultAccount(String email, String password, Set<Long> accounts)  {
        this(email, password);
        Assert.notEmpty(accounts);
        this.managerAccounts.addAll(accounts);
    }

// Getters

}

当使用第二个构造函数持久化
DefaultAccount
对象时,JPA不会将值从
managerAccounts
Set
传递到数据库。这有什么问题?

您需要将帐户设置为实例的managerAccounts:

public DefaultAccount(String email, String password, Set<Long> accounts)  {
        this(email, password);
        Assert.notEmpty(accounts);
        this.managerAccounts=accounts;
    }
公共默认帐户(字符串电子邮件、字符串密码、设置帐户){
这(电子邮件、密码);
Assert.notEmpty(账户);
这个.managerAccounts=帐户;
}
应该足够了。

这是我试过的

@Entity
@Table(name = "defaultaccounts")
public class DefaultAccount {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private Long      id;

    @Column(name = "email", nullable = false, unique = true)
    private String    email;

    @Column(name = "password", nullable = false)
    private String    password;

    @ElementCollection
    private Set<Long> managerAccounts = new HashSet<Long>();

    public DefaultAccount(String email, String password) {
        this.email = email;
        this.password = password;
    }

    public DefaultAccount(String email, String password, Set<Long> accounts) {
        this(email, password);
        this.managerAccounts.addAll(accounts);
    }
以下是发送到数据库的SQL(按预期插入4次)

值保存在数据库中

mysql> select * from defaultaccounts;
+----+---------------+----------+
| id | email         | password |
+----+---------------+----------+
|  1 | test@test.com | test     |
+----+---------------+----------+
1 row in set (0.00 sec)

mysql> select * from default_account_manager_acc;
+-----------------+------------------+
| default_account | manager_accounts |
+-----------------+------------------+
|               1 |            10001 |
|               1 |            10000 |
|               1 |            10002 |
+-----------------+------------------+
3 rows in set (0.00 sec)

this.managerAccounts=accounts不会这样做吗?如果您发布db persistent的代码会更好!!!.addAll()方法提供了更多功能。您可以发布如何保存吗?请尝试执行entityManager.flush()
        EntityManager em = // get entity manager from entity manager factory
        em.getTransaction().begin();

        HashSet accounts  = new HashSet();
        accounts.add(new Long(10000));
        accounts.add(new Long(10001));
        accounts.add(new Long(10002));

       DefaultAccount account  =  new DefaultAccount("test@test.com", "test", accounts);
       em.persist(account);

        em.getTransaction().commit();
        em.close();
insert 
        into
            defaultaccounts
            (email, password) 
        values
            (?, ?)

insert 
        into
            default_account_manager_acc
            (default_account, manager_accounts) 
        values
            (?, ?)

insert 
        into
            default_account_manager_acc
            (default_account, manager_accounts) 
        values
            (?, ?)

insert 
        into
            default_account_manager_acc
            (default_account, manager_accounts) 
        values
            (?, ?)
mysql> select * from defaultaccounts;
+----+---------------+----------+
| id | email         | password |
+----+---------------+----------+
|  1 | test@test.com | test     |
+----+---------------+----------+
1 row in set (0.00 sec)

mysql> select * from default_account_manager_acc;
+-----------------+------------------+
| default_account | manager_accounts |
+-----------------+------------------+
|               1 |            10001 |
|               1 |            10000 |
|               1 |            10002 |
+-----------------+------------------+
3 rows in set (0.00 sec)