gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:15:12 25 4
gpt4 key购买 nike

我的实体类中有一个 SetLong 值。我希望此 Set 存储此类特定实例的值。这是我的代码:

@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

}

持久化代码:

private EntityManager entityManager;

@PersistenceContext(unitName = "crm-db")
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}

public EntityManager getEntityManager() {
return entityManager;
}

public void createAccount(Account account) {
entityManager.persist(account);
}

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

最佳答案

这是我尝试过的

@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);
}

我的测试代码

        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();

这是发送到数据库的 SQL(如预期 总共插入 4 次)

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)

关于java - @ElementCollection 不在我的表中存储值 (JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25574072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com