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)